2014-04-08 46 views
0

此代碼將新對象添加到函數內的靜態列表中。 該列表通過引用傳遞給函數。靜態列表中的變量生存期

什麼在列表中的新對象的生命週期?

代碼示例:

#include <list> 
#include <string> 
#include <iostream> 

using namespace std; 

struct MyStruct 
{ 
    int x; 
    string str; 
}; 

void addStructToList(list<MyStruct> &myStructlist, int _x, string _str) 
{ 
    MyStruct newStruct; 
    newStruct.x = _x; 
    newStruct.str = _str; 
    myStructlist.push_back(newStruct); 
} 

void main() 
{ 
    list<MyStruct> myStructlist; 
    addStructToList(myStructlist, 111, "aaa"); 
    addStructToList(myStructlist, 222, "bbb"); 
    addStructToList(myStructlist, 333, "ccc"); 

    for (auto it = myStructlist.begin(); it != myStructlist.end(); it++) 
    { 
     cout << it->x << " " << it->str << endl; 
    } 

    system("pause"); 
} 

輸出:

111 aaa 
222 bbb 
333 ccc 
Press any key to continue . . . 

問:

是在內存使用方面的代碼安全嗎?

什麼是「newStruct」一生? addStructToList()或Main()?

+1

我在代碼中看不到任何靜態列表。 – Oktalist

+0

建議閱讀:[爲什麼「使用名稱空間標準;」被認爲是不好的做法?](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) – Deduplicator

回答

1

此代碼在內存使用方面是否安全?

是的,它是安全的。 liststring自動處理內存管理。如果您將很多項目添加到列表中(如100000000),則可能會出現內存不足錯誤。

什麼是「newStruct」一生? addStructToList()或Main()?

newStruct只存在於函數addStructToList中。但是創建一個副本並將其放入myStructlist。該副本生活在Main

小的附加備註:始終以const引用傳遞string而不是值:

void addStructToList(list<MyStruct> &myStructlist, int _x, const string& _str) { ... } 

另一句話:你用的是「靜態」的誤導。請參閱The static keyword and its various uses in C++以解釋C++中的靜態方法。