C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏

C++ Memory leak caused by a pointer being set to NULL in the class destructor

本文关键字:NULL 泄漏 内存 设置 于类 析构函数 指针 C++      更新时间:2023-10-16

我有一个类,其中.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,但实际指向的内存不会被销毁,对吧,导致内存泄漏?

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

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

是的。会的。

我该如何解决这个问题?

您可以像删除指针一样

~className()
{
delete dbsk2d_ishock_edge;
}

或最佳做法是使用智能指针作为成员变量,方法是包含<memory>。 您也可以参考这一点,因为看起来您不知道它们。 例如:

protected:
std::shared_ptr<dbsk2d_ishock_edge>  _cShock;

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

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