2014-01-25 120 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

相關問題