我被告知如果我有多个指向同一个对象的指针,我就无法正常删除它(使用delete关键字)。相反,我被告知我需要将指针设置为NULL或0。
鉴于我有:
ClassA* object = new ClassA();
ClassA* pointer1 = object;
ClassA* pointer2 = object;
因此,对于delete
pointer1
和pointer2
,我是否需要执行以下操作?
pointer1 = 0;
pointer2 = 0:
我将其设置为NULL后,是否仍需要使用关键字delete
?或者只是将它设置为0足够好?
答案 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;
}
如果您未将其设置为0
或NULL
,并且赢得if
,则可以将其双重删除。
答案 6 :(得分:0)
代码用new创建对象;它应该用删除来销毁对象。一旦。有其他指向对象的事实无关紧要,代码是否将这些指针设置为0也无关紧要。(除非您使用垃圾收集器运行,否则您不会这样做)。将这些指针设置为0的唯一好处是,如果您的程序使用0作为标志,则表示没有对象。这是一个设计决定,无论是否合适都无法从这里提供的信息中得到回答。