2011-04-16 146 views
1

当我在对象上使用delete关键字时,是否执行了对象析构函数?如果我删除的对象包含其他指针并且我不删除它们,那是内存泄漏吗?在被删除的对象内动态分配对象会发生什么?

我有时会在使用delete时感到困惑。当我传递信息时,问题对我来说是最糟糕的。我不知道何时可以安全地使用delete,因为害怕消除从别处指向的对象。

+0

这不是'delete'关键字的问题,而是每个对象破坏的问题。如果你离开了这个范围,那么你的对象被分配到了堆上,那么析构函数将被调用,并且你引用的指针将会丢失,如果你已经用'new'创建并且用'delete'销毁的话。 – lvella 2011-04-16 02:32:53

回答

3

当我使用delete关键字的对象上的对象的析构函数执行?

是的。这就是析构函数的用途。

如果被删除的对象包含其他指针而我不删除它们,那是内存泄漏吗?

是的。这是最常见的内存泄漏源之一。

我不知道什么时候可以安全地使用delete,因为害怕消除从别处指向的对象。

这是一个难题。没有完美解决问题的系统,但通过使用引用计数智能指针并减少共享对象的数量,您可以获得相当大的回报。

0

这是一个内存泄漏。这是一个非常普遍的问题。当你删除一个你用来分配内存的对象时,它会调用这个对象的析构函数。析构函数是您应该提供实现来清理(删除)该对象生命期内可能分配的所有内存的位置。

0

如果使用new,则必须使用delete。这将触发实例的析构函数被调用。如果该实例在其构造函数(或更高版本)中new'd任何对象,它应该在其析构函数中删除它们。另外,如果你新建数组(new char [20]等),你必须在删除时使用'delete []',否则行为是不确定的。

可以避开很多痛苦使用的std :: TR1 :: shared_ptr的,或升压:: shared_ptr的,它会做引用计数,并为你做了删除,这是不是:

Foo *pFoo = new Foo; 

std::tr1::shared_ptr<Foo> pFoo(new Foo); 

那么你并不需要做删除:当shared_ptr的的公共引用计数为零它会做删除你。

1

当我在 对象上使用delete关键字时,是否执行了对象析构函数 ?

什么,如果我反对删除 包含其他指针,我不 删除它们,是内存泄漏?

是的,除非其他人也有一个指针,并且其他人负责删除它们。由于双删除,您也可能有问题。如果你删除了一个给你的指针,但是别人有一个指向那个内存的指针,那么他的指针现在就没有指向任何东西。当他使用该指针时,他的程序可能会崩溃。

我不知道什么时候是安全的使用 删除恐惧消除被指向从 其他地方的 的对象。

你不是唯一一个。在您的代码部分之间建立关于谁拥有什么的协议和约定很重要。什么是“生产”对象。什么是“消费”他们。您也可能希望使用诸如boost :: shared_ptr和boost :: weak_ptr之类的工具来进行引用计数。

0

当您拨打删除someObect;发生这样的事情:

if(someObect != NULL) 
{ 
someObect->~ClassName();// you did ClassName someObect = new ClassName(); 
operator delete(someObect); 
} 

而且delete操作符做我的理解同样的事情,那免费做 - 它释放(解除分配)的内存。但请记住,如果您使用您不能使用免费,您必须使用删除并且只有它。

相关问题