C++ push_back(*new obj()) 和 push_back(obj()))有什么区别?
c++ what's the difference between push_back(*new obj()) and push_back(obj())?
我当前正在遇到与:
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;
- 推导 std::vector::back() 的返回类型
- 如何在.obj文件上运行IlDasm?
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 在 opengl 中渲染 obj 文件时出现黑窗口
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- 正在读取 obj 文件!(指数)
- 我在主函数的左括号上不断收到错误,消息为obj\Debug\main.o||在函数"ZN11linked_listC1Ev"中:|
- float* 已在 Gameobject.obj 中定义
- 可执行文件C++包括.obj,.lib和.dll吗?
- C++成功复制动态分配的 obj 而不复制 ctor?
- OBJ 文件C++与 ubuntu 问题
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- OBJ 向量到成员函数
- 在istream_iterator中使用后的 C++ FSTREAM obj 回滚
- 使用sscaf_s从obj读取顶点线不起作用
- 移植DXUT SDKMesh以导入OBJ文件,在哪里添加纹理坐标和索引
- /usr/bin/ld: build-debug/obj/gpsitem.o: 文件无法识别: 文件被截断
- 将多个网格放入单个波前 OBJ 文件中