2016-08-24 2 views
-1

I、ポインタのリストアクセス違反エラーポインタリストへのポインタを作成するときに

list<ObjectClass*> *lst_testList;

へのポインタを作成しようとし、それを私がプログラムを構築することができます

void FunctioningClass::functioningMethod() 
{ 
    ObjectClass *object = new ObjectClass(); 
    object->i_testing = 234; 
    lst_testList->push_back(object); 
    object = lst_testList->front(); 
    cout<<object->i_testing; 
    std::getchar(); 
} 

この方法を使用しようとしてメートル。しかし、私はそれを実行すると、このエラーが表示されます。

ConsoleApplication7.exeの0x012885DAで未処理の例外が発生しました。0xC0000005:0x00000004という場所を読み取るアクセス違反。

私はこの

list<ObjectClass*> lst_testList; 

のようなリストを作成し、このようにそれを使用することを通告、

lst_testList.push_back(object); 

それはtは私にエラーを与え、didnの。

+1

'lst_testList'はうんざりですか?私はそれを初期化したのですか? – songyuanyao

+0

http://stackoverflow.com/questions/6500313/why-should-c-programmers-minimize-use-of-new –

答えて

1

このようなlist<ObjectClass*> lst_testList;変数はdefault-initializedです。

ポインタの場合list<ObjectClass*>* lst_testList;デフォルトの初期化は実行されません。それのための適切な初期化は、次のとおりです。

list<ObjectClass*>* lst_testList = new list<ObjectClass*>(); 

または

list<ObjectClass*>* lst_testList = NULL; 

それはあなたの目標によって異なります。

+0

2つの方法の間に長所と短所がありますか? –

+0

@YasithaBandara言いにくいです。これは、アプリケーションのアーキテクチャ(例えば、 'lst_testList'可視性)に依存します。グローバル変数の場合は、単一のインスタンス 'new list ()'を作成してアプリケーション上で使用できます。 'FunctioningClass'のフィールドであれば' lst_testList'を 'NULL'に初期化し、後で必要なときに' newlist () 'を作成することができます。 – Nikita

+0

@ YasithaBandara一般的なアプローチは、常にポインタをある値に初期化することです。 'NULL'は予測可能な動作を保証します。ポインタがなぜNULLであるのかを理解するのは簡単ですが、[dangling pointer](https://en.wikipedia.org/wiki/Dangling_pointer)の予期しない動作をデバッグするのは非常に難しいです。 – Nikita

3

list<ObjectClass*> *lst_testListは、ObjectClassポインタのリストへのポインタです。それを使用するには、最初に割り当てるか、 (すでに見つかった)list<ObjectClass*> lst_testList(ObjectClassポインタのリスト)を使用する必要があります。

関連する問題