소멸자를 호출하는 세 가지 접근법에 중대한/심각한 차이가 있는지 궁금합니다. 다음 코드를 고려하십시오. main()
에 언급 된 두 가지 사례도 고려하십시오. 사례 1의 경우 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;
}
하는 것은 특정하십시오!
또한,이 방법으로 TestUsingPlacementNew()
을 작성하려고했지만, 그것은 런타임 예외 (++ 2008 MSVC)을 던지고. 왜 그런지 모르겠다 :
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
게재 위치를 새로 사용할 때 두 번째 단락이 두 번째 경우입니까? – Nawaz
@Nawaz : 답변을 시도한 부분을 나타내는 답변을 업데이트했습니다. –
업데이트 해 주셔서 감사합니다. :-) – Nawaz