c++ - 检查未释放的指针

标签 c++ pointers memory-management

假设一个指针对象被分配到一个点上并且它被返回给不同的嵌套函数。有一次,我想在检查它是否有效或已经被某人取消分配后取消分配该指针。

是否可以保证其中任何一个都有效?

if(ptr != NULL)
   delete ptr;

if(ptr)
   delete ptr;

此代码无效。它总是给出段错误

#include <iostream>
class A
{
    public:
    int x;
     A(int a){ x=a;}
     ~A()
     { 
          if(this || this != NULL) 
              delete this;
     }
};
int main()
{ 
    A *a = new A(3);
    delete a;
    a=NULL;
}

编辑

每当我们谈论指针时,人们就会开始问,为什么不使用智能指针。 就因为有智能指针,所以不是每个人都能用。

我们可能正在研究使用旧式指针的系统。有一天,我们无法将它们全部转换为智能指针。

最佳答案

if(ptr != NULL) delete ptr;

OR

if(ptr) delete ptr;

这两者其实是等价的,也和delete ptr;一样,因为在NULL指针上调用delete是保证有效的(就像,它什么都不做)。

如果 ptr 是一个悬挂指针,它们不能保证工作。

含义:

int* x = new int;
int* ptr = x;
//ptr and x point to the same location
delete x;
//x is deleted, but ptr still points to the same location
x = NULL;
//even if x is set to NULL, ptr is not changed
if (ptr)  //this is true
   delete ptr;   //this invokes undefined behavior

在您的特定代码中,您会得到异常,因为您在析构函数中调用了 delete this,而析构函数又再次调用了析构函数。由于 this 永远不会是 NULL,您将得到 STACK OVERFLOW,因为析构函数将不受控制地递归。

关于c++ - 检查未释放的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11153863/

相关文章:

c - 如何在 C 中的 void * 中存储 double

c - 静态内存分配和动态内存分配的区别

c++ - 单向链表在中间添加节点

c++ - 堆与堆栈内存使用 C++ 用于动态创建的类

javascript - 运行 javascript 过夜后系统挂起

c++ - 在 Ubuntu 的终端上运行 C++ 文件

c++ - 如何通过Matlab Mex编译工具使用C++编译器

c++ - 使用 C++ 检测 iPhone 的方向

c++ - boost mpz_int 基数不是 2、8、10、16

C++ 返回对象