请考虑以下代码:
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
.