指向对象及其析构函数的指针

时间:2012-04-01 16:16:13

标签: c++ pointers destructor delete-operator

class finder
{
    public:
        finder();
        ~finder();
}

int _tmain(int argc, _TCHAR* argv[])
{
    finder* pfind = new finder(L"test");
    finder find(L"test2");
    system("PAUSE");
    return 0;
}

我知道在程序退出后会调用找到的析构函数,但不会调用pfind的析构函数。我的问题是为什么?我应该添加

delete _pfind;

返回0之前?

3 个答案:

答案 0 :(得分:3)

“为什么”是因为您负责管理使用new创建的对象的生命周期。

该语言表示具有自动存储持续时间的对象(如示例中的find)与创建它们的块一样长。这些内容会在适当的时间自动删除(您不得自行删除)(即通常在您离开该区块时)。

动态存储持续时间对象(如pfind所指向的)持续到您删除它们为止。什么都不会删除它们。

所以是的,在这种情况下,您需要使用delete pfind;删除它。

(或者为您的用例使用适当类型的智能指针。)

答案 1 :(得分:1)

是的,您应该通过在非托管指针上调用delete来明确清理您分配的内存。通常,通过new分配内存的任何代码块必须通过代码块进行平衡,该代码块通过delete解除内存。

答案 2 :(得分:0)

Mat是对的,但是我注意到你正在使用CLR / .Net C ++(或者他们现在称之为的任何东西)。我相信这附带一个gcnew关键字,它将与new关键字做同样的事情,但删除其范围末尾的对象。这也称为垃圾收集。个人记录中同时具有newgcnew是一个很好的工具,因为它们都很适合不同的情况。请注意,如果您使用gcnew,则代码不会跨平台。