我在此方法中发现了现有程序(c ++自动生成代码)中的错误:
void _CallStyle _WFObjectVarAsStringExtractEFAgent::LoadValue(Pointer __VarAddress, aType theVarType) {
absolute(tpPointer, VarAddress, __VarAddress);
aLightObject Obj = nil;
Obj = aLightObject(*VarAddress);
if ( Obj == Nil ) {
this->SetValue("");
} else {
this->SetValue(Obj->StringExtract(this->ExtractKind, this->ExtractParam, 0));
}
this->Lock();
if ( Obj == Nil ) {
this->Disable();
} else {
this->Enable();
}
}
有时,行Obj = aLightObject(*VarAddress);
不返回有效的aLightObject
实例Nil
(但是已损坏的aLightObject
实例)。
因此,在以下行if ( Obj == Nil ) {
中,我们输入else
块,尝试执行Obj->StringExtract
调用时程序失败。
我如何测试Obj
实例是否有效?
答案 0 :(得分:1)
如果指针不是NULL / NIL / Nil或其他一些“可识别的'不是指针'”那么几乎无法确定它是否是有效指针。当然,如果它“几乎为空”,你可能有机会使用一些不可移植的代码来检查以下内容:
ptrdiff_t diff = NULL - reinterpret_cast<char *>(ptr);
if (diff < -100000) cout << "Bad pointer" << ptr << endl;
您还可以检查对象是否是有效指针,并包含您知道它应该是什么的内容。这样做的典型方法是拥有一个“神奇的”,例如:
class myobject
{
public:
int magic;
...
myobject() : magic(1234567) // Make sure it's different for each type of object.
{
...
}
....
};
...
if (obj->magic != 1234567) cout << "Object is not right type..." << endl;
但是,如果obj
只是0 ... 2 n 之间的某个完全任意值,则这不起作用,其中n是机器的位数。它只会像你没有在第一时间检查它一样严重崩溃。