2014-01-25 66 views
0

我目前有涉及到一个问题:C++ vector - push_back(* new obj())和push_back(obj())有什么区别?

vector<myObj> myVector; 

Q1。请告诉我它们的区别如下两行之间:

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

注:我知道,行a)是不好的做法,因为它是通过动态分配MyObj中的内容,将其复制到载体中,因此之前导致内存泄漏不能被释放...

但是,我在假设这两行应该导致包含完全相同内容的向量,虽然看起来这种假设是不正确的。我正在开发RUNS的软件,使用a)(我知道,这是造成漏洞,请尽量忽略这一点),但在b)行中出现各种不同的exc_bad_access错误。 Q2302。任何人都可以解释为什么这可能是?

编辑:当发布此我本来认为我的问题,必须与在产生的向量内容差一些,但我的问题是实际上与落实“三法则” http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming) 谢谢@WhozCraig,@ juanchopanza & @Alex Antonov为您提供帮助!

+6

'*新MyObj中()'我为大家介绍内存泄漏操作。 – Borgleader

+1

请显示'myObj'的定义。 –

+1

如果不崩溃(一),但与(b)中,在某个地方'myObj'你可能不会实现[三规则(http://en.wikipedia.org/wiki/Rule_of_three_做(C%2B%2B_programming))。我差点赌上它。 – WhozCraig

回答

2

在A线)要创建2个对象,你有以下方法调用:
1)默认的构造为第一对象
2)复制构造的第二个目的

在线b)您要创建2个对象,以及,但你有以下方法调用:
1)默认的构造为第一对象
2)复制构造第二个对象
3)析构第一对象

如此明显的线)的作品,因为析构函数没有被调用。这意味着,最有可能在b)行中,你正在释放/释放析构函数中的某些资源(例如动态分配的内存),然后尝试通过第二个对象访问该资源。在这种情况下,您需要正确实施复制构造函数。例如。您需要在复制构造函数中分配新的内存/对象,而不是简单地将指针复制到内存/对象。

4

的区别是什么?

不同的是A线)会导致内存泄漏和B线)没有。这是因为a)中动态分配的对象被立即丢弃,并且没有句柄可以调用delete。该向量拥有并拥有其元素,在这种情况下,它是您推回到其中的副本。

我目前正在开发的软件运行良好,使用a)行,但在b)行上出现各种不同的exc_bad_access错误。

它似乎运行良好,但它有资源泄漏。因此,任何想象力都没有问题。如果您在b)行有问题,则可能是,因为myObj管理资源并且不遵循rule of three。 b)线应该适合精心设计的课程。

+0

他已经知道了。此外,(一)工程,但(二)不 –

+0

感谢指出,罗希特...赞赏。 – mindTree

+1

@RohitChatterjee他声称知道它,但似乎并不真正知道它,从文本和“作品”的说法来判断。另外,a)不可能“工作”,它可能似乎这样做。 – juanchopanza

0

A1:不同之处在于(a)在堆上创建一个对象,然后将其解除引用,(b)创建一个堆栈对象。

A2:既然你还需要删除堆分配的对象,你会得到一个内存泄漏。 std :: vector不会为你做这件事,因为它不知道传递的对象是分配在堆还是堆栈上。

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

std::vector<*myObj> myVector; 
+0

感谢您的回复qstebom,我意识到这一点。但是,我主要关心的是在结果向量内容有什么不同? – mindTree

+0

std :: vector <*myObj>看起来像一个输入错误 –

+0

另外,使用“动态vs自动分配”而不是“堆栈vs堆”。“堆栈”和“堆”是实现细节,在描述抽象行为时是不相关的,它们可能根本不存在 – 2014-01-25 08:59:48

相关问题