C++ 在c+中打印析构函数+;

C++ 在c+中打印析构函数+;,c++,destructor,C++,Destructor,我有这个代码。输出是:~A~A~AprintA~AprintA~AprintA~A。我理解为什么它会打印出printA~AprintA~AprintA~A(因为我有3个push_back),但我不理解为什么“~A”会在句子开头出现3次。如果我有v.push_back(A)(只有这个,没有其他2个按钮),“~A”不会出现,为什么 #include<vector> #include<iostream> class A { public: vir

我有这个代码。输出是:~A~A~AprintA~AprintA~AprintA~A。我理解为什么它会打印出printA~AprintA~AprintA~A(因为我有3个push_back),但我不理解为什么“~A”会在句子开头出现3次。如果我有
v.push_back(A)(只有这个,没有其他2个按钮),“~A”不会出现,为什么

#include<vector>
#include<iostream>
    class A {
    public:
        virtual void print() {
            std::cout << "printA";
        }
        virtual ~A() {
            std::cout << "~A";
        }
    };



int main() {
    std::vector<A> v;
    A a;
    A b;
    A c;
    v.push_back(a);
    v.push_back(b);
    v.push_back(c);
    for (auto e : v)
        e.print();

        }
#包括
#包括
甲级{
公众:
虚拟空打印(){

std::cout当您将对象推回向量时,它的
大小()
将增加。然后,当通过
推回()
添加足够的对象时(在这种情况下,初始对象后只需要1个)和
容量()
变为真向量必须增加容量才能容纳更多元素,这需要重新分配,从而破坏和重构对象,这就是为什么您会看到析构函数调用

使用
reserve(new\u cap)
尝试在添加向量之前增加向量的容量,您将看到析构函数调用不会发生:

std::vector<A> v;
v.reserve(10);
A a;
A b;
A c;
//etc..
std::vector v;
v、 储备(10);
A A;
A b;
A c;
//等等。。

当您只推回1个对象时,不会发生这种情况,因为必须重新创建的向量中不包含任何内容。

重新分配;在循环中复制。您的问题格式不正确。请花点时间解决此问题……而且您的输出格式不是最佳的。如果您放入
“\n”
每次cout后,读取标准输出将更容易:在打印
\n
之前(或当outuput缓冲区已满时),字符串将不会显示。如果不这样做,则无法保证打印顺序,并且您可能会遇到类似的问题