C++ 在c+中打印析构函数+;
我有这个代码。输出是:~A~A~AprintA~AprintA~AprintA~A。我理解为什么它会打印出printA~AprintA~AprintA~A(因为我有3个push_back),但我不理解为什么“~A”会在句子开头出现3次。如果我有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
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缓冲区已满时),字符串将不会显示。如果不这样做,则无法保证打印顺序,并且您可能会遇到类似的问题