我在这里有这行:
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
管理在析构函数中释放的资源。如果在复制对象时调用了析构函数,则资源将被释放并且该对象将变为无效,指向不再存在的资源。
我如何实例化一个类,在该类中将生成的对象放置在向量的后面,但在过程中不会被复制(并因此被破坏)?
我希望可以构造SomeClass并将其移到向量的背面,而没有任何副本。
那是真的。
但是,析构函数在这里被调用。
确实。那将是您传递给move构造函数的临时对象:
someSTLVector.push_back(SomeClass(...)); ^^^^^^^^^^^^^^
存在用于初始化临时对象的语法。
显然,SomeClass被构造然后复制到向量中。
那么,移动要准确。尽管移动是复制的一种形式。
我不想避免这种情况,而是将其构造为向量的一部分(或至少移至向量,以避免任何复制)。
您已经设法避免了复制。为了避免移动,可以使用emplace_back
成员函数代替push_back
:
someSTLVector.emplace_back(...);
这会将参数直接转发到元素的构造函数。
如果在复制对象时调用了析构函数,则资源将被释放并且该对象将变为无效,指向不再存在的资源。
如果您的析构函数释放了一些资源,则默认的move构造函数/赋值可能没有按照您希望它们执行的操作进行。见规则五/三。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句