第一次破坏从何而来?

Hai*_*ang 0 c++

我试图练习以下代码:

#include <iostream>
#include <vector>

using namespace std;

class A
{
public:
   virtual void f(){cout<<"A"<<endl;}
   virtual ~A(){cout<<"destruct A"<<endl;}
};

int main()
{
   A o1,o2;
   vector <A > O;
   O.push_back(o1);
   cout<<"1"<<endl;
   O.push_back(o2);

cout<<"test"<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果证明是:

1
destruct A
test
destruct A
destruct A
destruct A
destruct A
Run Code Online (Sandbox Code Playgroud)

对第一个析构函数的来源感到困惑.

Ben*_*ley 5

你的向量在第二次调用push_back时重新分配了它的内存缓冲区.这需要将其中的对象复制到新缓冲区,并且原始对象被销毁.

如果O.reserve(2)在插入任何对象之前调用,那么将为向量提供足够的空间来对两个对象进行调整.所以它不需要重新分配,你不应该在main结束之前看到任何破坏.从技术上讲,如果您的编译器糟透了并且制作了不必要的副本,那么可能会有更多的破坏.但是,从你到目前为止所显示的内容来看,似乎并没有这样做.