【问题标题】:C++: extra copy constructor calledC ++:调用了额外的复制构造函数
【发布时间】:2021-01-04 11:17:35
【问题描述】:

了解复制构造函数的概念我无法解释以下简单测试程序的调试输出:

#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;
}

它的输出:

ctor A
ctor A
copy ctr A
dtor A
ctor B
ctor B
copy ctr B
ctor A
copy ctr A
dtor A
dtor B
dtor A
dtor B

我期待以下输出:

ctor A
ctor A
copy ctr A
dtor A
ctor B
ctor B
copy ctr B
dtor B
dtor A
dtor B

如果有人知道我想知道这种行为的原因......

g++.exe(Rev5,由 MSYS2 项目构建)10.2.0

提前致谢!

【问题讨论】:

  • 看来您假设内存(和对象)是由向量构造函数分配的。 push_back() 也可以重新分配。

标签: c++ copy-constructor


【解决方案1】:

当您向向量添加项目时,它可能会被重新分配。这意味着分配了新内存,并将项目从旧内存复制到新内存。此过程调用复制构造函数。

为防止重新分配,请预先保留必要的内存。

vector<Module> vec;
vec.reserve(2);
vec.push_back(Module{'A'});
vec.push_back(Module{'B'});

注意(因为它经常被误解)reserve 不会改变向量的大小,它只是分配更多的内存,因此向量可以增长而无需重新分配。

【讨论】:

  • 有道理,我忘了vector在push_back上动态分配内存的问题。谢谢你的解释!
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 2018-10-17
  • 2013-04-17
相关资源
最近更新 更多