C++ push_back(*new obj()) 和 push_back(obj()))有什么区别?

c++ what's the difference between push_back(*new obj()) and push_back(obj())?

本文关键字:obj back push 什么 区别 new C++      更新时间:2023-10-16

我当前正在遇到与:

vector<myObj> myVector;

Q1。请告诉我以下两行之间的区别:

a) myVector.push_back(*new myObj());
b) myVector.push_back(myObj());

注意:我意识到行a)是不良练习,因为它通过在将MyOBJ的内容分配到将其复制到向量之前,导致内存泄漏,因此无法释放...

但是,我的假设是,这两种线都应导致包含完全相同内容的向量,尽管该假设似乎不正确。我目前正在开发的软件使用行a)(我知道,我知道这会导致泄漏,请尝试暂时忽略此泄漏),但是在B行上使用各种不同的Exc_Bad_Access错误崩溃)。

)。

Q2。谁能解释为什么这可能是?

编辑:发布此内容时,我最初认为我的问题必须与结果矢量内容的某些差异有关,但是我的问题实际上与符合"三个规则"的"规则" http://en.wikipedia.org/有关wiki/rule_of_three_(c%2B%2B_编程)谢谢 @whozcraig,@juanchopanza&amp;@Alex Antonov提供帮助!

有什么区别...

区别是行a)导致内存泄漏,而b)不会。这是因为A)中动态分配的对象立即被丢弃,并且在其上没有调用delete的手柄。矢量保存并拥有其元素,在这种情况下,这是您将其推回去的副本。

我目前正在开发的软件使用行a),但在b行上使用各种不同的exc_bad_access错误崩溃)。

它似乎运行良好,但是它具有资源泄漏。因此,从任何想象力中,它都不好。如果您对行B)可能是因为myObj管理资源,并且不遵循三个的规则。b)应在设计精良的课程中正常工作。

在A行中)您正在创建2个对象,并且您有以下方法:
1)第一个对象的默认构造函数
2)第二个对象的复制构造函数

b)b)您也创建了2个对象,但是您有以下方法:
1)第一个对象的默认构造函数
2)第二个对象的复制构造函数
3)第一个对象的破坏者

很明显,线a)有效,因为未调用破坏者。这意味着B)最有可能在destructor中进行交易/释放某些资源(例如动态分配的内存),然后尝试通过第二个对象访问该资源。在这种情况下,您需要正确实现复制构造函数。例如。您需要在复制构造函数中分配新的内存/对象,而不是简单地将指针复制到内存/对象。

a2:由于您还需要删除同层的堆,因此您将获得内存泄漏。std :: vector不为您执行此操作,因为它不知道传递的对象是在堆还是堆栈上分配的。

将对象插入向量时,将被复制。如果要保持堆分配的对象,则需要定义它:

std::vector<*myObj> myVector;