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之前?
答案 0 :(得分:3)
“为什么”是因为您负责管理使用new
创建的对象的生命周期。
该语言表示具有自动存储持续时间的对象(如示例中的find
)与创建它们的块一样长。这些内容会在适当的时间自动删除(您不得自行删除)(即通常在您离开该区块时)。
动态存储持续时间对象(如pfind
所指向的)持续到您删除它们为止。什么都不会删除它们。
所以是的,在这种情况下,您需要使用delete pfind;
删除它。
(或者为您的用例使用适当类型的智能指针。)
答案 1 :(得分:1)
是的,您应该通过在非托管指针上调用delete
来明确清理您分配的内存。通常,通过new
分配内存的任何代码块必须通过代码块进行平衡,该代码块通过delete
解除内存。
答案 2 :(得分:0)
Mat是对的,但是我注意到你正在使用CLR / .Net C ++(或者他们现在称之为的任何东西)。我相信这附带一个gcnew
关键字,它将与new
关键字做同样的事情,但删除其范围末尾的对象。这也称为垃圾收集。个人记录中同时具有new
和gcnew
是一个很好的工具,因为它们都很适合不同的情况。请注意,如果您使用gcnew
,则代码不会跨平台。