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 インスタンスが存在しないようにしていますか? 最初に質問した理由は、元のプログラムの static 変数行をコメントアウトしたところ、プログラムが正常に動作したためでした。ただし、このコードを試した後 (これは、私が行っていることを多かれ少なかれエミュレートします)、静的変数行を削除しても違いはありませんが、それでも同じように失敗します。

これは単純かもしれませんが、何が悪いのか途方に暮れています。助けてくれてありがとう。

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

どこにもインスタンスを作成しておらず、コンストラクターにFooa を渡していないため、戻り値である NULL に初期化されます。次に、短絡ロジックを逆方向に使用したためにステートメントがクラッシュします (非 NULLポインターを返す最初の検証の前にアクセスしようとしています)。Foo*BarBar::_fooBar::getFoo()ifFoo::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 に答える