デストラクタを呼び出すこれらの3つのアプローチに重大な/重大な相違があるかどうか不思議です。次のコードを考えてみましょう。 main()
に記載されている2つのケースも考慮してください。デストラクタを呼び出す方法の比較
class Sample
{
public:
~Sample()
{
cout << "destructor called" << endl;
}
void destroyApproach1() { this->~Sample(); }
void destroyApproach2() { delete this; }
};
void destroyApproach3(Sample *_this)
{
delete _this;
}
void TestUsingNew()
{
Sample *pSample[] = { new Sample(), new Sample(),new Sample()};
pSample[0]->destroyApproach1();
pSample[1]->destroyApproach2();
destroyApproach3(pSample[2]);
}
void TestUsingPlacementNew()
{
void *buf1 = std::malloc(sizeof(Sample));
void *buf2 = std::malloc(sizeof(Sample));
void *buf3 = std::malloc(sizeof(Sample));
Sample *pSample[3] = { new (buf1) Sample(), new (buf2) Sample(), new (buf3) Sample()};
pSample[0]->destroyApproach1();
pSample[1]->destroyApproach2();
destroyApproach3(pSample[2]);
}
int main()
{
//Case 1 : when using new
TestUsingNew();
//Case 2 : when using placement new
TestUsingPlacementNew();
return 0;
}
あなたに答えている。その場合へと返信するとき特定してください:ケース1またはケース2、またはその両方!
また、私はこの方法でTestUsingPlacementNew()
を書くしようとしていたが、それは実行時例外(MSVC++ 2008)を投げています。私は理由を理解していない:
void TestUsingPlacementNew()
{
const int size = sizeof(Sample);
char *buffer = (char*)std::malloc(size * 3);
Sample *pSample[] = { new (buffer) Sample(), new (&buffer[size]) Sample(),new (&buffer[2*size]) Sample()};
pSample[0]->destroyApproach1();
pSample[1]->destroyApproach2();
destroyApproach3(pSample[2]);
}
たぶん、メモリパディングおよび/またはアライメントが理由だろうか?
関連トピック:Destructor not called after destroying object placement-new'ed
2番目の段落は新しい配置を使用する場合の2番目の段落ですか? – Nawaz
@Nawaz:私は、答えようとしている部分を示すために答えを更新しました。 –
更新のおかげで:-) – Nawaz