2015-04-29 50 views
-3

我看到了删除指针amd使其在析构函数中为空的常见做法,即使没有内存分配给堆上的指针。考虑下面的C++代码:内存管理指针

dummy.h

class dummy 
{ 
    int* a; 
} 

dummy.cpp

dummy::dummy():a(NULL) 
    { cout<<Inside Const"; } 

    dummy::~dummy() 
    { 
    if(a!=NULL) 
    { 
     delete a; 
     a = NULL; 
    } 
    } 

    bool func() 
    { 
    a = func1(); 
    } 

在上面的代码中,虽然存储器到一个未在堆上分配,即使如此,它被删除。它不应该导致内存泄漏?

+0

你的问题有点含糊不清... –

+0

@DavidHaim - 你在这里发现什么含糊不清?你不觉得你的评论含糊不清吗? –

+0

在析构函数中使指针为NULL的常见做法?做什么的? – juanchopanza

回答

2

使它变为空是完全没有意义的,因为它即将被销毁。

由于if (a!=NULL),您的代码不会删除它,如果它为空。然而,这也是毫无意义的:将空指针应用delete将无所作为,因此您可以将析构函数简化为无条件的delete a;(假设您知道它为空或指向使用new创建的对象)。

根据Rule of Three您确实需要确保您的类不可复制或具有有效的复制语义;否则,复制对象将导致两次删除相同的内存,这是不允许的。更好的是,停止杂耍指针,并使用智能指针,容器和其他RAII类型来使生活更简单。

0

您不应该在指向指向非堆对象的对象的指针上调用delete。如果你这样做,程序可能会忽略该行。或者它可能会抹去你的硬盘。或者它可能会忽略您的计算机上的该行,并且在将该程序交给朋友之后,它将清除硬盘驱动器。不要这样做。

相关:当你有一个管理内存的指针时,你的类缺少拷贝构造函数,并且复制赋值是严重。或者,将int*会员更换为unique_ptr<int>会员,该会员可以为您管理建筑和活动。

+1

...除非指针为null,这是完全可以接受的(在这种情况下它什么都不做)。 (旁白:downvote不是我的。) – Cameron

+0

@Cameron:呃,对。忘记这种情况。 –