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

Pointer to object and its destructor

本文关键字:析构函数 指针 对象      更新时间:2023-10-16
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;
}
我知道 find 的析构函数

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

delete _pfind;

在返回 0 之前?

"为什么"是因为您负责管理使用 new 创建的对象的生存期。

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

动态存储持续时间对象(如pfind指向的对象(会一直持续到您将其删除为止。没有什么会为您删除它们。

所以是的,在这种情况下,您需要自己删除它,并delete pfind;.

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

是的,您应该通过在非托管指针上调用 delete 来显式清理分配的内存。通常,任何通过new分配内存的代码块都必须通过通过delete释放该内存的代码块来平衡。

Mat 是对的,但我注意到您使用的是 CLR/.Net C++(或者他们现在怎么称呼它(。我相信这带有一个 gcnew 关键字,它将执行与 new 关键字相同的操作,但在其范围结束时删除对象。这也称为垃圾回收。就个人而言,同时拥有newgcnew是一个很好的工具,因为它们都非常适合不同的情况。请记住,如果您使用 gcnew,您的代码将不会是跨平台的。