将循环中的元素添加到容器(生存期)
Adding elements in loop to container (lifetime)
如果我使用下面的代码将元素添加到向量中,那么在调用foo时,vec的元素(自动变量)已经被销毁,因为它们在其中创建的范围结束了。
std::vector<A> vec;
for (int i = 0; i < n; i++) {
A a;
vec.push_back(a);
}
foo(vec);
我现在的问题是,对于这样一个问题,教科书上的解决方案是
否,vec
中的元素将是a
的不同副本。
但是,如果要使用operator[]
或使用vec.push_back()
:,则需要分配vec
的大小
for (int i = 0; i < n; i++) vec.push_back(A());
编辑(问题更改后):
即使push_back()
将其参数作为引用,它也会在内部复制它。它逐个引用它的参数,以避免在复制到内部存储之前生成不必要的副本。
不要担心堆栈变量。当您在std::vector中推送值时,这个容器会创建变量的堆副本。因此,当你生活在这个范围内时,你所有的变量都会存在。
您可以将变量定义为全局变量,在循环中只让该变量中的值,然后返回
相关文章:
- GCC对可能有效的代码抛出init list生存期警告
- 在不复制临时对象的情况下延长其生存期
- 结束另一个线程中使用的对象的生存期
- "this"指针的值在对象的生存期内是否恒定?
- 创建具有全局生存期的 UObject
- C++17 和静态临时生存期的参考扩展
- 数组对象的生存期是否在重用其元素存储时结束?
- 共享指针生存期
- 具有空洞初始化的对象的生存期
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 指针引用的生存期(以 C++为单位)
- 子表达式中临时对象的生存期
- 对临时对象的Const引用不会延长其生存期
- 对象存在与对象生存期不同吗
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- 全局静态生存期?他们会让你的程序崩溃吗?
- "std::function"的简单版本:函数对象的生存期?
- 您能否根据是否使用返回值来保证不同的生存期行为?
- 理解C++指针生存期/僵尸指针
- 将循环中的元素添加到容器(生存期)