Flexo1515
Flexo1515

Reputation: 1017

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

Apologies ahead of time, as I am not even sure how to phrase the question, but I was working on a homework assignment (to which the question is unrelated except that I ran into the problem working on the assignment) and came across certain problem (this is just an extraction and generalization, I left out destructors, etc...):

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;
};

As I mentioned, this is not the code I am working with, but I believe it more clearly identifies what is happening. BAR passes the getFoo() check, so _foo isn't(?) NULL but getFoo()->getID() faults at if(_id).

Is the static variable somehow preventing any NULL instance of a pointer to that class type from existing? The reason I asked that at first was because when I commented out the static variable lines in my original program, the program worked fine. HOWEVER, after trying this code (which more or less emulates what I am doing) removing the static variable lines makes no difference, it still faults the same.

This may be simple, but I am at a loss as to what is wrong. Thank you much for any help.

Upvotes: 0

Views: 1017

Answers (3)

Arun
Arun

Reputation: 2102

You have to pass pointer to Foo object to BAR

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

Provide the destructor to cleanup _foo after usage

~Bar() {  if(_foo) delete _foo; _foo=NULL; }      

Upvotes: 0

Remy Lebeau
Remy Lebeau

Reputation: 598309

You are not creating a Foo instance anywhere, and not passing a Foo* to the Bar constructor, so Bar::_foo gets initialize to NULL, which is what Bar::getFoo() returns. And then your if statement crashes due to your backwards use of short-circuit logic (you are trying to access Foo::getID() before first validating that Bar::getFoo() returns a non-NULL Foo* pointer).

Upvotes: 1

jltrem
jltrem

Reputation: 12544

Check pointers before using them.

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

Upvotes: 1

Related Questions