Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++:调用了额外的复制构造函数_C++_Copy Constructor - Fatal编程技术网

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'});