静态列表中的可变生命周期

时间:2014-04-08 23:01:19

标签: c++ list object-lifetime lifetime lifetime-scoping

此代码将新对象添加到函数内的静态列表中。 通过引用函数传递列表。

列表中新对象的生命周期是什么?

代码示例:

#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 . . .

问题:

此代码在内存使用方面是否安全?

什么是&#34; newStruct&#34;一生? addStructToList()或Main()?

1 个答案:

答案 0 :(得分:1)

  

这个代码在内存使用方面是否安全?

是的,这是安全的。 liststring自动处理内存管理。如果要在列表中添加很多项目(例如100000000),则可能会出现内存不足错误。

  

什么是&#34; newStruct&#34;一生? addStructToList()或Main()?

newStruct仅存在于函数addStructToList中。但是会创建一个副本并将其放入myStructlist。该副本存在于Main

小附加注释:始终通过const引用而不是值传递string

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

另一句话:你使用&#34; static&#34;误导性。有关C ++中静态含义的解释,请参阅The static keyword and its various uses in C++