gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:36:57 26 4
gpt4 key购买 nike

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

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com