【发布时间】:2016-04-29 01:34:48
【问题描述】:
我将对象存储在 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要处理已经构造在指定位置的元素。 -
@T.C.这正是我的问题……
标签: c++ c++11 destructor stdvector