【发布时间】:2019-08-19 21:41:14
【问题描述】:
我正在向函数中的向量添加对象。代码如下所示:
class MyObj
{
int a;
int b;
MyObj( int ai, int bi )
{
this->a = ai;
this->b = bi;
}
};
vector<MyObj> myVec;
void foo()
{
MyObj objInst( 10, 20 );
myVec.push_back( objInst );
}
我希望对象正在从堆栈中占用空间,因此在函数返回后它们的内存应该被释放。根据我的经验,情况并非如此,即容器中的对象可以在函数外部访问,到目前为止没有问题。 有人可以告诉我为什么会这样吗? STL 容器是否会复制传递给它们的对象的数据并将其保存在堆或全局内存中的某个位置?
非常感谢@Louen 的 cmets。读了这篇文章,学到了很多。 https://www.internalpointers.com/post/c-rvalue-references-and-move-semantics-beginners
【问题讨论】:
-
“我预计对象正在从 [stack] 中占用空间,因此在函数返回后它们的内存应该被释放。”是的。当您在自动内存中创建一个对象(例如 std::string)时,该对象会从自动内存中获取它的内存。退出示波器时会释放自动内存。当 std::string 被释放时,它会释放它正在管理的任何堆内存。 (你会发现很多使用全局变量的负面 cmets ......我根本没有。)
-
来自维基百科:“标准模板库 (STL) 是 C++ 编程语言的软件库,它影响了 C++ 标准库的许多部分。它提供了四个组件,称为算法、容器、函数和iterators.[1]" 我认为您可能使用的是编译器附带的“C++ 标准库”,而不是 STL。
标签: c++ stl containers dynamic-memory-allocation lifetime