2

我在此方法中的现有程序(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 ) {中,我们输入了elsebloc,程序在尝试执行Obj->StringExtract调用时失败。

我如何测试Obj实例是否有效?

4

1 回答 1

2

如果指针不是 NULL/NIL/Nil 或其他一些“可识别的‘不是指针’”,那么几乎不可能确定它是否是有效指针。当然,如果它“几乎为 NULL”,您也许有机会使用一些不可移植的代码来检查以下内容:

 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 是机器的位数,则此方法不起作用。它会像你一开始没有检查它一样严重崩溃。

于 2013-04-10T12:59:45.277 回答