7

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

鉴于我有:

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

那么到delete pointer1and pointer2,我需要做以下事情吗?

pointer1 = 0;
pointer2 = 0:

一旦我将它设置为 NULL,我还需要使用关键字delete吗?还是只是将其设置为 0 就足够了?

4

7 回答 7

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

于 2012-08-20T11:04:45.513 回答
4

规则是你必须调用delete你调用的次数new
所以如果你只分配一次内存,你也只需要释放一次。

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

于 2012-08-20T11:04:52.493 回答
2

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

但是,如果您在删除对象时拥有指向该对象的“活动”指针,则可能表明您的代码存在问题。通常,当不再需要一个对象时,它会被删除,这意味着应该没有指针或其他对它的引用。当然,这不是硬性规定。

于 2012-08-20T11:05:11.323 回答
1

没有。您需要删除它并在此之后设置为 0,或使用智能指针

于 2012-08-20T11:03:35.170 回答
1

你必须使用delete其他方式你有内存泄漏

于 2012-08-20T11:04:22.783 回答
0

它不是你不能delete。但你不应该。因为删除一个已经删除的对象会使你的程序崩溃。你会看到glibc detected double free。所以最好的做法是

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

如果您没有将其设置为0orNULL并且 gaurd it win anif您可以将其双重删除。

于 2012-08-20T11:05:29.943 回答
0

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

于 2012-08-20T22:27:01.657 回答