我正在使用 std::vector
来存储对象,希望尽可能避免调用析构函数。
我用移动构造函数和赋值运算符替换了复制构造函数和赋值运算符:
class Object
{
Object(const Object&) = delete;
Object(Object&&);
Object& operator=(const Object&) = delete;
Object& operator=(Object&&);
[...]
};
我是这样初始化它的:
std::vector<Object> container;
container.reserve(42) // Reserve a lot in order to be sure it won't be a problem
然后,我使用emplace_back添加了两个元素(构造函数接受一个int
参数):
container.emplace_back(1);
container.emplace_back(3);
到目前为止,一切都很好。但是我想在最后一个元素之前使用emplace插入一个元素:
auto it = container.end();
it--; // Last position.
it--; // Before last position.
container.emplace(it, 2);
但是这里调用了一个析构函数。
我试图通过Valgrind定位原因,似乎emplace
函数调用了_M_insert_aux
,导致我的析构函数被调用。
我该如何避免这种情况?
emplace
与emplace_back
不同。emplace_back
只是构造一个新元素,而emplace
则必须处理指定位置已经构造好的元素。 - songyuanyao