在C++中解决复制语义问题

Geo*_*off 14 c++ c++11 c++14

请考虑以下代码:

class A
{

};

int main()
{
    std::vector<A> test;
    test.push_back(A());
}
Run Code Online (Sandbox Code Playgroud)

构造函数和析构函数将被调用两次,内存将被分配两次并且对象将被复制,现在不仅可能对性能有害,而且还可能导致运行时错误,特别是如果在析构函数中进行了一些清理.我通常会解决这个问题的方法是创建一个指针向量:

std::vector<A*> test;
test.push_back(new A());
Run Code Online (Sandbox Code Playgroud)

我的问题是双重的,这是一种常见的做法,是不是很好的做法?或者,还有更好的方法?如果这是一个欺骗请告诉我,我会关闭这个问题,但我找不到任何搜索.

Asu*_*Asu 25

使用emplace_back.

std::vector<A> test;
test.emplace_back();
//test.emplace_back(constructor, parameters);
Run Code Online (Sandbox Code Playgroud)

这样,A将就地构建,因此不会发生任何复制或移动.

编辑:澄清对问题的评论 - 不,这不会改变,push_back如果你暂时通过它.例如,

test.emplace_back(A{});
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,将导致构造,移动和销毁临时A,就像您使用的那样push_back.