c++无法为包含静态变量的对象设置NULL指针

C++ unable to set NULL pointer to static variable containing object?

本文关键字:对象 设置 NULL 指针 变量 静态 包含 c++      更新时间:2023-10-16

提前道歉,因为我甚至不确定如何表达这个问题,但是我正在做一个家庭作业(这个问题与我在作业中遇到的问题无关),并遇到了某些问题(这只是一个提取和概括,我忽略了析构函数等):

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不是(?)

getFoo()->getID()在if(_id)上错误

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

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

使用指针前检查。

int main() 
{
  Bar BAR;
  Foo *pFoo = BAR.getFoo();
  if (pFoo && pFoo->getID())
  {
    // do something
  }
  return 0;
};

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

必须将指向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; }