0

提前道歉,因为我什至不知道如何表达这个问题,但我正在做一个家庭作业(这个问题与这个问题无关,除了我在做作业时遇到了问题)并且遇到了某些问题(这只是一个提取和概括,我省略了析构函数等......):

class idType {
    int _id;
  public:
    int getID() { return _id; }
    idType(int in = -1) : _id(-1) {}
};


class Foo {
    static int _count;
    idType* _id; //int wrapper just for examples sake
  public:
    Foo() { _id = new idType(_count); ++_count; }
    idType* getID() { if(_id) return _id; return NULL; } //ERROR WHEN CALLED FROM BELOW
};

class Bar {
    Foo* _foo;
  public:
    Bar(Foo* foo = NULL) : _foo(foo) {}
    Foo* getFoo() { if(_foo) return _foo; return NULL; }
};

int foo::_count = 0;

int main() {
    Bar BAR;
    if(BAR.getFoo()->getID() && BAR.getFoo()); //RUN TIME ACCESS VIOLATION ERROR
    return 0;
};

正如我所提到的,这不是我正在使用的代码,但我相信它更清楚地表明了正在发生的事情。BAR 通过了 getFoo() 检查,所以 _foo 不是(?) NULL 但 getFoo()->getID() 在 if(_id) 处出错。

静态变量是否以某种方式阻止了指向该类类型的指针的任何 NULL 实例存在?我一开始问这个的原因是因为当我在原始程序中注释掉静态变量行时,程序运行良好。但是,在尝试了这段代码(或多或少地模拟了我正在做的事情)之后,删除静态变量行没有任何区别,它仍然会出现相同的错误。

这可能很简单,但我不知道出了什么问题。非常感谢您的帮助。

4

3 回答 3

1

在使用它们之前检查指针。

int main() 
{
  Bar BAR;
  Foo *pFoo = BAR.getFoo();
  if (pFoo && pFoo->getID())
  {
    // do something
  }
  return 0;
};
于 2013-05-17T00:25:53.533 回答
1

您没有在Foo任何地方创建实例,也没有将 a 传递Foo*Bar构造函数,因此Bar::_foo初始化为 NULL,这就是Bar::getFoo()返回的内容。然后您的if语句由于您向后使用短路逻辑而崩溃(您Foo::getID()在第一次验证Bar::getFoo()返回非空Foo*指针之前尝试访问)。

于 2013-05-17T00:26:02.817 回答
0

您必须将指向 Foo 对象的指针传递给 BAR

int main() {
    Bar BAR(new Foo);
     //Reverse the condition, check for pointer validity first
    if(BAR.getFoo() && BAR.getFoo()->getID());
    return 0;
};    

使用后提供析构函数来清理 _foo

~Bar() {  if(_foo) delete _foo; _foo=NULL; }      
于 2013-05-17T00:31:17.223 回答