怎么判断一个指向的对象是否被释放
如何判断一个指向的对象是否被释放
如下:
TButton* A = new TButton(this);
TButton* B = A;
delete A;
if (B == NULL)
{
ShowMessage("Null");
}
else
{
ShowMessage("Not Null");
}
此时,B不等于NULL,程序执行 ShowMessage("Not Null"), 请问如何判断B指向的对象是否被释放,让程序执行ShowMessage("Null");
------解决方案--------------------
用一个很好阐述楼上所表达的意思
AnsiString sStr = 3;
AnsiString sTmp = sStr;
delete的是sStr,sTmp依然=3
如果sTmp指向的是&sStr,你删掉sStr,这个时候sTmp才为NULL
是这样吧.
------解决方案--------------------
楼主用
assert吧
TButton* A = new TButton(this);
TButton* B = A;
delete A;
assert(B);//加这一行,如果B为空,这一行后边的代码就不会被执行了。直接退出该层调用
//用了assert就不需要用下这的if去判断了
if (B == NULL)
{
ShowMessage("Null");
}
else
{
ShowMessage("Not Null");
}
------解决方案--------------------
如果指针在多个地方使用,比较好的习惯是在delete后将对象指针赋值为NULL.
------解决方案--------------------
使用指针引用,而不是指针可解决你的问题。就用你的代码做为例子说明:
如下:
TButton* A = new TButton(this);
TButton* B = A;
delete A;
if (B == NULL)
{
ShowMessage("Null");
}
else
{
ShowMessage("Not Null");
}
此时,B不等于NULL,程序执行 ShowMessage("Not Null"), 请问如何判断B指向的对象是否被释放,让程序执行ShowMessage("Null");
------解决方案--------------------
用一个很好阐述楼上所表达的意思
AnsiString sStr = 3;
AnsiString sTmp = sStr;
delete的是sStr,sTmp依然=3
如果sTmp指向的是&sStr,你删掉sStr,这个时候sTmp才为NULL
是这样吧.
------解决方案--------------------
楼主用
assert吧
TButton* A = new TButton(this);
TButton* B = A;
delete A;
assert(B);//加这一行,如果B为空,这一行后边的代码就不会被执行了。直接退出该层调用
//用了assert就不需要用下这的if去判断了
if (B == NULL)
{
ShowMessage("Null");
}
else
{
ShowMessage("Not Null");
}
------解决方案--------------------
如果指针在多个地方使用,比较好的习惯是在delete后将对象指针赋值为NULL.
------解决方案--------------------
使用指针引用,而不是指针可解决你的问题。就用你的代码做为例子说明:
- C/C++ code
TButton* A = new TButton(this); TButton*& B = A; delete A; A = NULL; if (B == NULL) { ShowMessage("Null"); } else { ShowMessage("Not Null"); }
------解决方案--------------------
这是一个很值得挖掘的问题,在指针、内存及指针引用的使用方面非常具有教学研究意义
可惜啊
------解决方案--------------------
调用 delete A
是将A指针所指向的内存中的资源释放掉 ,
指针A仍然存在,这时A指针还是指向着该内存地址
所以加一句 A = NULL;
可以避免一些内存错误,
------解决方案--------------------
------解决方案--------------------
1、通过组件查找, 组件的 Owner 必须是当前类
bool Exists = false;
for (int i = 0; i < ComponentCount; i++)
if (Components[i] == B)
Exists = true;
2、通过控件查找, 下例的控件的 Parent 是当前表单,在知道放在什么面板或页面等内时,请在该父控件下找,不知道放在哪里,可以采用枚举方式。
bool Exists = false;
for (int i = 0; i < ControlCount; i++)
if (Control[i] == B)
Exists = true;
3、很另类吧通过容错机制,但也值得一试。
//--------------------
if (B)
try
{
if (B->Visible);
}
catch ( EAccessViolation &E)
{
B = NULL;
}
ShowMessage( B ? "还在呢!" : "已经释放!");
------解决方案--------------------
路过,进来看看,学习。。。。。。。。。。。。。。。。。。。!
------解决方案--------------------
------解决方案--------------------
delete 之后,一定要把所有指向这片内存的指针置NULL,可别出野指针呀。
------解决方案--------------------
好象搞复杂了,只要判断(B)就可以了:
TButton* A = new TButton(this);
TButton* B = A;
delete A;
if (B)