当多个指针指向它时删除一个对象?

时间:2012-08-20 11:01:29

标签: c++ pointers memory-management

我被告知如果我有多个指向同一个对象的指针,我就无法正常删除它(使用delete关键字)。相反,我被告知我需要将指针设置为NULL或0。

鉴于我有:

ClassA* object = new ClassA();
ClassA* pointer1 = object;
ClassA* pointer2 = object;

因此,对于delete pointer1pointer2,我是否需要执行以下操作?

pointer1 = 0;
pointer2 = 0:

我将其设置为NULL后,是否仍需要使用关键字delete?或者只是将它设置为0足够好?

7 个答案:

答案 0 :(得分:9)

每当你new一个对象时,你需要delete它,释放内存

ClassA* object = new ClassA();

delete object; // Free's the memory you allocated.

将指针设置为NULL的目的是停止取消引用指针无效

object = NULL;

这样做是为了在尝试取消引用之前执行测试:

if(object != NULL)
{
  object->SomeMethod(); // We can assume it's safe to use the pointer.
}

另请注意,您可以从指向它的任意指针中删除内存。

ClassA* object = new ClassA();
ClassA* pointer1 = object;
ClassA* pointer2 = object;

delete pointer1; 

object, pointer1, and pointer2现在所有指向已经发布的内存,除非重新定义它们,否则它们都应设置为 NULL

答案 1 :(得分:4)

规则是您必须多次调用delete来调用new
因此,如果您只分配了一次内存,则只需要释放一次内存。

使用shared_ptr可以更好地避免这种手动内存管理,其中智能指针本身将在没有指针指向它时释放内存。

答案 2 :(得分:2)

您必须确保在删除对象后不再使用该对象。你是否有指向它的指针并不重要,但你需要知道这些指针现在无效。将它们设置为nullptr只是一种在使用它们时确保崩溃的方法;使用无效指针可能会或可能不会导致崩溃,但最终会导致难以追踪的模糊问题。

但是,如果在删除对象时有“实时”指针,那么可能表示代码中存在问题。通常,当没有人需要它时,对象会被删除,这意味着应该没有指针或其他引用。当然,这不是一个严格的规则。

答案 3 :(得分:1)

不。您需要将其删除并在此之后设置为0,或使用智能指针

答案 4 :(得分:1)

您必须使用delete,否则您将拥有memory leak

答案 5 :(得分:0)

不是你不能delete。但你不应该。因为删除已删除的oibject会导致程序崩溃。你会看到glibc detected double free。所以最好的做法是

if(object){
   delete object;
   object = 0;
}

如果您未将其设置为0NULL,并且赢得if,则可以将其双重删除。

答案 6 :(得分:0)

代码用new创建对象;它应该用删除来销毁对象。一旦。有其他指向对象的事实无关紧要,代码是否将这些指针设置为0也无关紧要。(除非您使用垃圾收集器运行,否则您不会这样做)。将这些指针设置为0的唯一好处是,如果您的程序使用0作为标志,则表示没有对象。这是一个设计决定,无论是否合适都无法从这里提供的信息中得到回答。