如何测试实例是否已损坏?

时间:2013-04-10 12:47:06

标签: c++

我在此方法中发现了现有程序(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实例是否有效?

1 个答案:

答案 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是机器的位数。它只会像你没有在第一时间检查它一样严重崩溃。