C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
C++ Memory leak caused by a pointer being set to NULL in the class destructor
我有一个类,其中.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;
}
}
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何在映射中返回null
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- Klocwork Inside的资源泄漏
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 为什么返回 NULL 不会破坏函数?
- 构造函数中的 QQuickItem 父项 null
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏