C++ 当多个指针指向某个对象时是否删除该对象?

C++ 当多个指针指向某个对象时是否删除该对象?,c++,pointers,memory-management,C++,Pointers,Memory Management,有人告诉我,如果有多个指针指向同一个对象,我通常无法删除它(使用delete关键字)。相反,我被告知需要将指针设置为NULL或0 鉴于我有: ClassA* object = new ClassA(); ClassA* pointer1 = object; ClassA* pointer2 = object; 因此,要删除指针1和指针2,我需要执行以下操作吗 pointer1 = 0; pointer2 = 0: 将其设置为NULL后,是否仍需要使用关键字delete?或者只是将其设置为0就

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

鉴于我有:

ClassA* object = new ClassA();
ClassA* pointer1 = object;
ClassA* pointer2 = object;
因此,要
删除
指针1
指针2
,我需要执行以下操作吗

pointer1 = 0;
pointer2 = 0:

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

否。您需要删除它,然后将其设置为0,或者使用智能指针

您必须使用
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; 

对象、指针1和指针2现在都指向已释放的内存,除非重新定义它们,否则它们都应设置为NULL

规则是您必须调用多次调用
delete

所以,如果只分配了一次内存,那么也只需要取消分配一次


您最好使用
shared\u ptr
来避免这种手动内存管理,即一旦没有指针指向智能指针,智能指针本身将释放内存。

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


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

这不是你不能
删除的规则。但你不应该。因为删除已删除的OIObject会使程序崩溃。您将看到
glibc检测到双重自由
。因此,如果

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

如果您没有将其设置为
0
NULL
,并且如果
您可以将其双重删除。

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

delete pointer1
删除指针2但不是全部,然后将两个指针都设置为0,您最好使用
std::shared\u ptr
@Kerrek我不知道您的意思是什么?我只是说“将指针设置为NULL与删除它不同。”。不清楚OP是否意识到这一点。别跟我胡闹了!:)另一种方法是:在C++中(与java或Objtovi-C不同),编译器不会从设置指针为null的事实中做出任何推论。您需要显式删除对象,将引用设置为null是为了程序自身的内部一致性/信息。这不是“最佳实践”。这是不必要的冗长
delete对象
已经忽略空指针,在
0
上写入
0
同样无害。