【发布时间】: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<B*> test在列表上需要多态性时是必需的(并且 B 是基类)。但只有在这里......我同意这对内存泄漏/双重释放不利。 -
更好的方法是为
B实现移动构造函数。 -
@Jean-FrançoisFabre 在这种情况下,智能指针不是更合适吗?至少只要向量应该拥有对象。
-
不是微优化,
emplace_back让优化变得很琐碎。