5

的定义some_class是:

class some_class
{
   // stuff

public:
   ~some_class()
   {
         delete dynamic_three;
   }

private:
   classA one;
   classB two;
   classC* dynamic_three;
}

当一个对象的生命周期结束时,它的销毁是:(1)调用它的析构函数和(2)按照它们在类定义中声明的顺序(=内存中的位置)销毁它的子对象。

但是,如果我有这样的事情:

auto* ptr = new some_class();

// more stuff

ptr->~some_class(); // l. X

步骤(2)也实现了?我的意思是,在第 X 行中,子对象的析构函数是否也被调用或仅在some_class析构函数的主体中执行?

4

3 回答 3

2

步骤(2)也实现了?

是的,这是有保证的。该行为是安全的,但请注意,在您的情况下,您无法安全地回收对象的内存,而无需先通过placement-new 重新构建它(除非您operator new为对象覆盖,因此您可以保证内存是如何分配的并使用匹配的释放)。

于 2013-03-12T18:01:04.427 回答
2

让我们做一个测试:

class classA
{
public:
    ~classA() { cout << "~classA()" << endl; }
};

class classB
{
public:
    ~classB() { cout << "~classB()" << endl; }
};

class some_class
{
public:
    ~some_class() { cout << "~some_class()" << endl; }

private:
    classA one;
    classB two;
};

int main()
{
    cout << "Start..." << endl;
 
    auto* ptr = new some_class();

    ptr->~some_class();

    cout << "End." << endl;
}

输出:

开始...

~some_class()

〜类B()

~classA()

结尾。

所以所有的析构函数都以相反的顺序被调用。

于 2013-03-12T18:07:24.810 回答
1

当一个对象的生命周期结束时,它的销毁是:(1)调用它的析构函数和(2)按照它们在类定义中声明的顺序(=内存中的位置)销毁它的子对象。

(3) 释放分配的内存。

步骤(2)也实现了?

步骤(2)是,但不是步骤(3)。

但如果你能写

auto* ptr = new some_class();

请注意,您也可以写

std::unique_ptr<ptr> ptr (new some_class());

这将需要delete您(当然,仅在符合您的需求时才使用它,但如果您不确定,则默认使用它)。

于 2013-03-12T18:01:34.440 回答