2013-10-12 69 views
0

我已經在我的main()如下:傳遞載體的功能

vector<Person*> alist; 
add(alist); 
printDetail(alist); 

然後,在另一個文件中,我把它叫做function.cpp,在這個文件中,我有以下幾種方法:

void add(vector<Person*> &mylist) 
{ 
    Person temp_p("firstname1","lastname1",20); 

    mylist.push_back(new Person("firstname2","lastname2",20)); 
    mylist.push_back(&temp_p); 

    printDetail(mylist); 
} 

void printDetail(vector<Person*> mylist) 
{ 
    for(int i=0;i<mylist.size();i++) 
    { 
     mylist[i]->display(); 
    } 
} 

當我運行這個程序時,add()方法中的printDetail(mylist)將打印出兩個結果沒有任何問題,但在main()中,只有firstname2將打印出來。

誰能告訴我爲什麼會發生這種情況?

回答

1

當你這樣做:

mylist.push_back(&temp_p); 

你存儲一個指針到矢量的局部變量。當函數返回時,它指向的對象將不再存在,所以你的向量留下了一個懸掛指針。這導致undefined behviour

+0

你能告訴我什麼我應該寫在這一行嗎?我嘗試以不同的方式傳遞temp_p,*,&等..但都得到錯誤。 – Qin

+0

@Qin你不能以任何方式將'temp_p'的地址傳遞給vector,因爲'temp_p'是函數的本地對象。你必須找出另一種方式去做你想做的事情。 – juanchopanza

+0

@Qin你最好不要存儲指針,而是在vector中存儲'Person'對象。這使得代碼既清潔又安全。 – juanchopanza

1

在主函數中試圖引用add()函數返回時刪除的對象。 另一個對象工作正常,因爲當你使用「new」運算符時,你顯式地爲該對象分配內存,並且在函數完成後它不會自動解析。 根據你要實現的內容,你應該自己爲temp_p分配內存(使用new運算符)或將其作爲全局對象來創建。