【发布时间】:2020-06-05 09:53:09
【问题描述】:
我这里有这行:
someSTLVector.push_back(SomeClass(...));
我希望 SomeClass 将被构造并移动到向量的后面,没有任何副本。然而,析构函数在这里被调用。我尝试用std::move 修改它:
someSTLVector.push_back(std::move(SomeClass(...)));
但结果没有改变。
我还尝试在SomeClass 中定义以下内容:
SomeClass(SomeClass&&) = default;
SomeClass& operator= (SomeClass&&) = default;
SomeClass(const SomeClass&) = delete;
SomeClass& operator= (const SomeClass&) = delete;
这也没有帮助,析构函数仍然被调用。请注意,SomeClass 包含一个引用作为成员
很明显SomeClass 被构造然后复制到向量中。我不想避免这种情况,并将其构建为向量的一部分(或至少移动到向量,避免任何复制)。 SomeClass 管理在析构函数中释放的资源。如果在复制对象时调用析构函数,则资源被释放,对象变为无效,指向不再存在的资源。
如何实例化一个类,在该类中生成的对象将被放置在向量的后面,但在此过程中不被复制(并因此被销毁)?
【问题讨论】:
-
这是XY problem:
std::vector没有任何问题。您的问题是您的默认移动构造函数没有做正确的事情。你必须要么删除它,要么定义它来做正确的事情。 -
没错,但我确实提供了足够的信息让人们了解实际需要做什么。
-
问题是回答明确说明的问题只会解决实际描述的问题的症状。使用
emplace_back将避免这种特定的移动/复制,但是如果移动构造函数没有以正确的语义定义,则该类仍然被破坏并且向量将偶尔失败。因此,答案将需要考虑回答明确的问题以及(不相关的)潜在问题。最好直接询问根本问题。
标签: c++ vector destructor stdvector