【问题标题】:Getting around copy semantics in C++绕过 C++ 中的复制语义
【发布时间】:2016-10-29 21:12:18
【问题描述】:

请考虑以下代码:

class A
{

};

int main()
{
    std::vector<A> test;
    test.push_back(A());
}

构造函数和析构函数将被调用两次,内存将被分配两次,对象将被复制,现在这不仅可能对性能不利,而且还可能导致运行时错误,尤其是在进行一些清理时析构函数。我通常解决这个问题的方法是只创建一个指针向量:

std::vector<A*> test;
test.push_back(new A());

我的问题有两个,这是常见的做法吗?它是好的做法吗?或者,还有更好的方法? 如果这是一个骗局,请告诉我,我会关闭这个问题,但我在搜索中找不到任何东西。

【问题讨论】:

  • 通常的做法是使用指针。 not 使用指针是一种很好的做法。如果您不使用指针并实现 movement 构造函数,那将是更好的做法。
  • 仍然,std::vector&lt;B*&gt; test 在列表上需要多态性时是必需的(并且 B 是基类)。但只有在这里......我同意这对内存泄漏/双重释放不利。
  • 更好的方法是为B实现移动构造函数。
  • @Jean-FrançoisFabre 在这种情况下,智能指针不是更合适吗?至少只要向量应该拥有对象。
  • 不是微优化,emplace_back 让优化变得很琐碎。

标签: c++ c++11 c++14


【解决方案1】:

使用emplace_back

std::vector<A> test;
test.emplace_back();
//test.emplace_back(constructor, parameters);

这样,A 将就地构造,因此不会发生复制或移动。

编辑:澄清有关问题的 cmets - 不,如果您暂时传递它,这不会从 push_back 改变。例如,

test.emplace_back(A{});

在 C++11 中,会导致临时 A 被构造、移动和销毁,就像您使用 push_back 一样。

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多