为什么要在std :: vector :: push_back(T object)方法中构造对象时调用析构函数?

卡罗夫斯基120

我在这里有这行:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

std :: vector :: push_back的成本是成功还是无效?

来自分类Dev

调用std :: vector :: push_back()会更改vector中的先前元素吗?

来自分类Dev

为什么在对std :: vector :: emplace_back()的调用中调用了复制构造函数?

来自分类Dev

std :: vector函数push_back中的奇怪段错误

来自分类Dev

为什么在构造时调用C ++类的析构函数?

来自分类Dev

MSVC中std :: vector :: push_back的实现

来自分类Dev

为什么std :: vector :: push_back需要赋值运算符

来自分类Dev

为什么std :: vector :: emplace调用析构函数而不调用任何拷贝构造函数?

来自分类Dev

push_back期间std :: vector分段错误

来自分类Dev

类中std :: vector的析构函数

来自分类Dev

在使用仅移动类型派生的类中定义析构函数时,使用std :: vector的emplace_back或push_back创建时会产生编译时错误

来自分类Dev

AddressSanitizer将std :: vector <T> :: push_back标识为释放后使用堆错误的原因

来自分类Dev

std :: vector <std :: unique_ptr <>> :: push_back()的正确语法是什么?

来自分类Dev

std :: vector中push_back函数的奇怪语法

来自分类Dev

关于`std :: vector :: push_back`的小数的选择

来自分类Dev

为什么std :: vector在离开其他作用域的同时调用析构函数?

来自分类Dev

将指针数组推入std :: vector中,避免使用push_back复制对象

来自分类Dev

错误:没有匹配的函数调用vector :: push_back

来自分类Dev

调用std :: vector :: push_back()会更改vector中的先前元素吗?

来自分类Dev

为什么std :: vector的构造函数调用自定义类的析构函数?

来自分类Dev

c ++ vector-push_back(* new obj())和push_back(obj())有什么区别?

来自分类Dev

为什么在构造时调用C ++类的析构函数?

来自分类Dev

线程安全性std :: vector push_back并保留

来自分类Dev

MSVC中std :: vector :: push_back的实现

来自分类Dev

OpenCV点的std :: vector,没有push_back方法

来自分类Dev

为什么使用虚拟析构函数进行std :: vector :: push_back segfaults?

来自分类Dev

std::vector<>::push_back 导致 Arduino 链接错误

来自分类Dev

想要简化我的 std::vector push_back 用法

来自分类Dev

为什么 push_back into vector<vector<int>> 导致段错误?

Related 相关文章

  1. 1

    std :: vector :: push_back的成本是成功还是无效?

  2. 2

    调用std :: vector :: push_back()会更改vector中的先前元素吗?

  3. 3

    为什么在对std :: vector :: emplace_back()的调用中调用了复制构造函数?

  4. 4

    std :: vector函数push_back中的奇怪段错误

  5. 5

    为什么在构造时调用C ++类的析构函数?

  6. 6

    MSVC中std :: vector :: push_back的实现

  7. 7

    为什么std :: vector :: push_back需要赋值运算符

  8. 8

    为什么std :: vector :: emplace调用析构函数而不调用任何拷贝构造函数?

  9. 9

    push_back期间std :: vector分段错误

  10. 10

    类中std :: vector的析构函数

  11. 11

    在使用仅移动类型派生的类中定义析构函数时,使用std :: vector的emplace_back或push_back创建时会产生编译时错误

  12. 12

    AddressSanitizer将std :: vector <T> :: push_back标识为释放后使用堆错误的原因

  13. 13

    std :: vector <std :: unique_ptr <>> :: push_back()的正确语法是什么?

  14. 14

    std :: vector中push_back函数的奇怪语法

  15. 15

    关于`std :: vector :: push_back`的小数的选择

  16. 16

    为什么std :: vector在离开其他作用域的同时调用析构函数?

  17. 17

    将指针数组推入std :: vector中,避免使用push_back复制对象

  18. 18

    错误:没有匹配的函数调用vector :: push_back

  19. 19

    调用std :: vector :: push_back()会更改vector中的先前元素吗?

  20. 20

    为什么std :: vector的构造函数调用自定义类的析构函数?

  21. 21

    c ++ vector-push_back(* new obj())和push_back(obj())有什么区别?

  22. 22

    为什么在构造时调用C ++类的析构函数?

  23. 23

    线程安全性std :: vector push_back并保留

  24. 24

    MSVC中std :: vector :: push_back的实现

  25. 25

    OpenCV点的std :: vector,没有push_back方法

  26. 26

    为什么使用虚拟析构函数进行std :: vector :: push_back segfaults?

  27. 27

    std::vector<>::push_back 导致 Arduino 链接错误

  28. 28

    想要简化我的 std::vector push_back 用法

  29. 29

    为什么 push_back into vector<vector<int>> 导致段错误?

热门标签

归档