C++:调用了额外的复制构造函数
理解复制构造函数的概念,我无法解释以下简单测试程序的调试输出:C++:调用了额外的复制构造函数,c++,copy-constructor,C++,Copy Constructor,理解复制构造函数的概念,我无法解释以下简单测试程序的调试输出: #include <iostream> #include <vector> using std::cout, std::endl, std::vector; class Module { private: char *name; public: // ctor Module(char n); // copy ctor Module(const Module &
#include <iostream>
#include <vector>
using std::cout, std::endl, std::vector;
class Module
{
private:
char *name;
public:
// ctor
Module(char n);
// copy ctor
Module(const Module &m);
// dtor
~Module();
};
Module::Module(char n)
{
name = new char;
*name = n;
cout << "ctor " << n << endl;
}
// copy ctor
Module::Module(const Module &m)
: Module{*m.name}
{
cout << "copy ctr " << *name << endl;
}
Module::~Module()
{
if (name != nullptr)
{
cout << "dtor " << *name << endl;
}
delete name;
}
int main()
{
vector<Module> vec;
vec.push_back(Module{'A'});
vec.push_back(Module{'B'});
return 0;
}
我期望得到以下结果:
如果有人知道我想知道这种行为的原因
g++.exe Rev5,由MSYS2项目10.2.0构建
提前谢谢 当您将项目添加到向量时,它可能会被重新分配。这意味着分配新内存,并将项目从旧内存复制到新内存。此进程调用复制构造函数 为防止重新分配,请事先保留必要的内存
vector<Module> vec;
vec.reserve(2);
vec.push_back(Module{'A'});
vec.push_back(Module{'B'});
注意:因为它经常被误解,所以保留不会改变向量的大小,它只会分配更多的内存,这样向量就可以增长而无需重新分配。当您向向量添加项目时,它可能会被重新分配。这意味着分配新内存,并将项目从旧内存复制到新内存。此进程调用复制构造函数 为防止重新分配,请事先保留必要的内存
vector<Module> vec;
vec.reserve(2);
vec.push_back(Module{'A'});
vec.push_back(Module{'B'});
注意,因为它经常被误解,reserve不会改变向量的大小,它只会分配更多的内存,这样向量就可以增长而无需重新分配。这是有道理的,我忘记了向量在push_back时动态分配内存的问题。谢谢你的解释!这是有道理的,我忘记了向量在push_-back上动态分配内存的问题。谢谢你的解释!您似乎假设内存和对象是由vectors构造函数分配的。push_back也可能重新分配。似乎您假设内存和对象是由vectors构造函数分配的。推回也可能重新分配。
vector<Module> vec;
vec.reserve(2);
vec.push_back(Module{'A'});
vec.push_back(Module{'B'});