c++ - 第一次毁灭从何而来?

标签 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;
}

结果是:

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/

相关文章:

c++ - boost regex_match 与 regex_search

c++ - Qt - moc 文件相关错误

c++ - std::vector::erase 删除最后一个元素而不是第一个

c++ - 错误 : '' cannot convert 'uint8* {aka unsigned int*}' to 'const emxArray_uint8_T*' ? '?

C++ cURL 链接错误 "unresolved external symbol _curl_easy_"

c++ - 在 C++ 类中修改指向 std::string 的指针

c++ - 在 C++ 的子类中强制执行静态方法重载

c++ - float 的字节顺序

C++ new 是 64 字节对齐的,等于缓存行大小

c++ - 为 Homebrew 软件构建 C++ 公式