在函数中实例化的STL对象是在堆栈还是堆上占用内存?

Ami*_*mir 1 c++ containers stl lifetime dynamic-memory-allocation

我将对象添加到函数中的向量。该代码如下所示:

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 );
}
Run Code Online (Sandbox Code Playgroud)

我期望对象从堆栈中获取空间,因此在函数返回之后,应该释放它们的内存。以我的经验,事实并非如此,即到目前为止,可以在函数外部访问容器中的对象,没有问题。有人可以告诉我为什么会这样吗?STL容器是否复制传递给它们的对象的数据并将其保存在堆中或全局内存中?

非常感谢@Louen的评论。阅读这篇文章并学到了很多东西。 https://www.internalpointers.com/post/c-rvalue-references-and-move-semantics-beginners

Lou*_*uen 5

这是发生的事情的细分。

myVec在函数体之外定义的向量是全局变量。这意味着它是在程序执行的开始(在main()调用之前)创建的,并在结束时(main()返回时)销毁。

foo()函数中,您可以MyObj在堆栈上创建类的实例,然后将其副本添加到全局向量中。

你可以检查它通过监测的拷贝构造函数复制MyObj,如图所示这里

foo()实例两端MyObj创建被破坏,但是从副本创建实例生活在全体向量。仅当全局向量本身销毁时,即在结束之后,才销毁它main()