在被删除的对象内动态分配对象会发生什么?

时间:2011-04-16 02:25:41

标签: c++ pointers memory-management destructor

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

我有时会对使用delete时感到困惑。当我传递东西时,问题对我来说是最糟糕的。我不知道何时使用delete是安全的,因为害怕消除从其他地方指向的对象。

6 个答案:

答案 0 :(得分:3)

  

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

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

  

如果我删除的对象包含其他指针并且我不删除它们,那是内存泄漏怎么办?

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

  

我不知道什么时候使用delete是安全的,因为害怕消除从其他地方指向的对象。

这是一个很难解决的问题。没有一个系统可以完美地解决它。但是你可以通过使用引用计数智能指针和减少共享对象的数量来实现目标。

答案 1 :(得分:1)

  

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

  

如果反对我删除了怎么办?   包含其他指针,我没有   删除它们,是内存泄漏吗?

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

  

我不知道什么时候使用它是安全的   删除,因为害怕消除   正在指向的对象   在其他地方。

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

答案 2 :(得分:0)

这是内存泄漏。这是一个非常普遍的问题。当您删除一个用于为其分配内存的对象时,它将调用该对象析构函数。析构函数是您应该提供实现来清理(删除)在该对象的生命周期中可能已分配的所有内存的地方。

答案 3 :(得分:0)

如果您使用new,则必须使用delete。这将触发实例的析构函数被调用。如果该实例在其构造函数(或更高版本)中新建了任何对象,则应在其析构函数中删除它们。

另外,如果你新建数组(new char [20]等),你必须在删除时使用'delete []',否则行为是未定义的。

你可以使用std :: tr1 :: shared_ptr或boost :: shared_ptr来避免很多痛苦,它会进行引用计数并为你做删除,而不是:

Foo *pFoo = new Foo;

DO

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

然后你不需要删除:当shared_ptr的公共引用计数变为零时,它将为你执行删除。

答案 4 :(得分:0)

是的,这是泄漏。查看Freestore management常见问题解答是否可以为您提供一些洞察力。

答案 5 :(得分:0)

当您致电删除someObect时,会发生如下情况:

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

operator delete 按照我的理解 free 做同样的事情 - 只需释放(释放)内存。但请记住,如果您使用 new ,则无法使用 free ,则必须使用 delete 并仅使用