2012-04-01 60 views
0
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之前吗?

+0

你不应该添加'delete',你应该删除'new'。 – avakar 2012-04-01 16:19:21

+1

你的代码充满了错误;如果你要发布片段,你应该尽可能使它们正确。 – meagar 2012-04-01 16:20:46

+1

@avakar学习'new'和'delete'没有什么错。当然,如果你不喜欢它们,你可以找到避免它们的方法,但实际使用它们并使它们适应并从错误中学习并决定你是否喜欢它们是没有问题的。 – 2012-04-01 16:25:12

回答

3

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

的语言说,具有自动存储时间的对象(比如在你的榜样find)住,只要在其中创建它们的块。这些都会自动删除(你不能做自己),在适当的时候(即通常当你离开该块。)

动态存储持续时间的对象(像什么pfind点),最后直到您删除它们。没有什么会为你删除它们。

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

(或使用相应类型的智能指针为您的使用情况。)

1

是的,你应该明确地通过调用非托管指针delete清理你分配内存。通常情况下,通过new分配内存的任何代码块必须通过delete取消分配该内存的代码块进行平衡。

0

垫是正确的,但我注意到你正在使用CLR/.NET C++(或不管他们叫这些天)。我相信这是一个gcnew关键字,它将与new关键字完成相同的操作,但在其范围末尾删除该对象。这也被称为垃圾收集。在个人笔记newgcnew是一个很好的工具,因为它们都很好地适应不同的情况。请记住,如果您使用gcnew,代码将不会跨平台。