【问题标题】:C++ Memory leak caused by a pointer being set to NULL in the class destructor [closed]由类析构函数中的指针设置为 NULL 引起的 C++ 内存泄漏[关闭]
【发布时间】:2018-11-05 04:46:59
【问题描述】:

我有一个 .h 文件的类:

class dbsk2d_ishock_node : public dbsk2d_ishock_elm{
protected:
    dbsk2d_ishock_edge* _cShock;
    //Some other variables
public:
    dbsk2d_ishock_node (int newid, double stime, vgl_point_2d<double> Or); //Constructor
    virtual ~dbsk2d_ishock_node (); //Destructor
    //Some other functions
}

.cxx 文件如下所示:

//Constructor
dbsk2d_ishock_node::dbsk2d_ishock_node (int newid, double stime, vgl_point_2d<double> Or) : dbsk2d_ishock_elm (newid, stime)
{
    _cShock = NULL;
    //Some other variables
}

//Destructor
dbsk2d_ishock_node::~dbsk2d_ishock_node ()
{
    _cShock = NULL;
    //Some other variables
}

现在这个类的构造函数设置_cShock = NULL;,虚拟析构函数也设置_cShock = NULL;

所以当调用析构函数时,它只会将指针设置为NULL,但实际指向的内存不会被破坏,对吧,导致内存泄漏?

这个类被调用了很多次,在某个时间点之后程序由于过多的内存使用而崩溃。我该如何解决这个问题?

【问题讨论】:

  • 不要使用受保护的数据。删除析构函数中的指针。还是我在这里遗漏了什么?
  • "但指向的实际内存不会被破坏,对吧" - 这是正确的。 “导致内存泄漏?” - 这取决于类是否拥有指向的对象。是吗?
  • 如果它确实拥有指向的对象,则不应使用原始指针开始。
  • 你为什么不使用像 std::unique_ptr 这样的智能指针类?
  • 我真的..真的很想问一个问题:“你如何保护数据?”尽管有裸指针

标签: c++ class c++11 pointers memory-leaks


【解决方案1】:

所以当调用析构函数时,它只会将指针设置为 NULL 但实际的记忆不会被破坏,对吧, 导致内存泄漏?

是的。会的。

我该如何解决这个问题?

你可以像这样删除指针

~className()
{
   delete dbsk2d_ishock_edge;
}

或最佳实践是使用Smart Pointers 作为成员变量,包括&lt;memory&gt;。 您也可以参考this,因为您似乎不知道它们。 例如:

protected:
    std::shared_ptr<dbsk2d_ishock_edge>  _cShock;

【讨论】:

    【解决方案2】:

    当您在构造函数中将指针设置为 NULL 时,您可以安全地释放内存

    ~className() { 
        if (dbsk2d_ishock_edge){
            delete dbsk2d_ishock_edge;
            dbsk2d_ishock_edge = NULL;
        }
    }
    

    【讨论】:

    • 你为什么要检查!= NULL?为什么之后还要将指针设置为NULL
    • 我认为你的意思是“析构函数”。
    • 你不需要检查 NULL(或者,更确切地说,nullptr),NULL 是删除的朋友。
    • @melpomene 指针在构造函数中设置为 NULL。可能永远不会调用 new ,如果您在未初始化的指针上调用 delete ,则可能会出现段错误。之后我设置为 NULL,因为如果我以这种方式将 ptr 地址复制到其他变量,我可以知道它不再存在。只是额外的安全
    • @AlbertoValero 指针在构造函数中设置为NULL。它永远不会未初始化。另一方面,如果指针实际上未初始化,则 @​​987654325@ 具有未定义的行为。
    猜你喜欢
    • 2017-10-31
    • 2015-08-28
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2014-09-25
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多