2013-07-23 61 views
1

如何在不改變後者的情況下通過已有的對象(同一個類對象)分配一個動態分配的對象。代碼,這似乎不起作用:通過已有的對象初始化一個動態分配的對象

ClassName<T> Object1(parameters); 
... 
ClassName<T>* pObject2 = new ClassName<T>(parameters); 
pObject2 = &Object1; 
...some operations on pObject2 
delete pObject2 
+0

** N.B。**您正在詢問_assignment_,而不是_initialisation_。 –

+0

好吧,輕軌在軌道上的比賽,我改變了它的問題。 –

回答

2

你在做什麼是Object1複製到什麼pObject2點,而不是你只要把指針pObject2Object1,從而失去你分配的內存。

這會導致你試圖釋放你沒有分配的內存,當你指定delete指針時,這是未定義的行爲,並且很可能會導致崩潰。

你想要做的就是使用提領操作*上的指針pObject2,來獲取對象的指針指向,並分配給對象,而不是:

*pObject2 = Object1; 

或者使用當分配類的拷貝構造函數:

ClassName<T>* pObject2 = new ClassName<T>(Object1); 
+0

謝謝Joachim,它解決了這個問題。 –

1

您正在分配指針。您需要分配內容:

*pObject2 = Object1; 

pObject2是一個指針。如果指定它,則指向Object1,忘記指向過程中動態創建的實例的指針。您需要分配實例*pObject2。這將調用ClassName<T>::operator=,它可以自動生成以分配所有成員,也可以手動編寫,以便爲該類型進行其他任何正確的操作。


編輯:當然,作爲圭多Kanschat中的其他問題來實現,而這是發生了什麼事你嘗試,你真的應該直接使用拷貝構造函數。無論如何,當你要用object1重新初始化它時,爲什麼用任意垃圾初始化第二個對象。

3

假設你有一個拷貝構造函數:

ClassName<T>* pObject2 = new ClassName<T>(Object1); 

在您的代碼片段中,您首先將值分配給Object2,這些值立即丟棄。此外,您甚至會覆蓋指針本身,從而導致內存泄漏,方法是爲其分配Object1的地址,而不是將其內容分配給指向的內存。

+0

當然!爲什麼要初始化第二個實例,如果要用對象1重新初始化它... –

+0

這是正確的方法。然而,這並不是最好的答案,因爲它沒有告訴OP他的嘗試有什麼問題。 –

+0

謝謝你們。軌道上的輕軌,OP有什麼問題? –

1

像其他人一樣,你應該使用define a copy constructor,或者重載賦值運算符。然後,所有你需要做的是以下幾點:

ClassName<T>* pObject2 = new ClassName<T>(Object1); 

,或者

ClassName<T>* pObject2 = new ClassName<T>(parameters); 
*pObject2 = Object1; 

當然,以確保您不會修改原來的,你可能想在deep copy vs. shallow copy閱讀起來。