2016-08-24 80 views
-1

I,M試圖創建指向指針列表訪問衝突錯誤指針列表

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

我可以構建程序。但是當我運行它時,它給了我這個錯誤。 0000005:在0x012885DA在ConsoleApplication7.exe

未處理的異常訪問衝突讀取位置0x00000004。

通知,當我這樣

list<ObjectClass*> lst_testList; 

創建列表,並使用它像這樣,

lst_testList.push_back(object); 

它沒,T給我任何錯誤。

+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

兩種方法之間有什麼優點和缺點嗎? –

+0

@YasithaBandara很難說。它取決於你的應用程序的體系結構(例如'lst_testList'可見性)。如果它是全局變量,則可以創建單個實例'new list ()'並在應用程序中使用它。如果它是一個「FunctioningClass」字段,則可以在需要時將'lst_testList'初始化爲'NULL',並在稍後創建一個實例'new list ()'。 – Nikita

+0

@YasithaBandara一般的方法是始終初始化指向某個值的指針。 'NULL'將保證可預測的行爲。很容易理解爲什麼指針是'NULL',但很難調試[dangling指針](https://en.wikipedia.org/wiki/Dangling_pointer)的不可預知的行爲。 – Nikita

3

list<ObjectClass*> *lst_testList是指向ObjectClass指針列表的指針。爲了使用它,您需要首先分配它,或者使用list<ObjectClass*> lst_testList(這是ObjectClass指針的列表),您可以先分配它或 (如您已經發現的那樣)。