我正在尝试练习以下代码:
#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;
}
结果是:
1
destruct A
test
destruct A
destruct A
destruct A
destruct A
对第一个析构函数的来源感到困惑。
最佳答案
您的 vector 在第二次调用 push_back 时重新分配了它的内存缓冲区。这需要将其中的对象复制到新缓冲区,并销毁原始对象。
如果您在插入任何对象之前调用 O.reserve(2)
,这将为您的 vector 提供足够的空间来容纳两个对象。所以它不需要重新分配,并且在 main 结束之前你不应该看到任何破坏。从技术上讲,如果您的编译器很烂并进行不必要的复制,可能会有更多的破坏。但是,从您目前展示的内容来看,它似乎并没有这样做。
关于c++ - 第一次毁灭从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9797915/