如何在不改變後者的情況下通過已有的對象(同一個類對象)分配一個動態分配的對象。代碼,這似乎不起作用:通過已有的對象初始化一個動態分配的對象
ClassName<T> Object1(parameters);
...
ClassName<T>* pObject2 = new ClassName<T>(parameters);
pObject2 = &Object1;
...some operations on pObject2
delete pObject2
如何在不改變後者的情況下通過已有的對象(同一個類對象)分配一個動態分配的對象。代碼,這似乎不起作用:通過已有的對象初始化一個動態分配的對象
ClassName<T> Object1(parameters);
...
ClassName<T>* pObject2 = new ClassName<T>(parameters);
pObject2 = &Object1;
...some operations on pObject2
delete pObject2
你在做什麼是Object1
不複製到什麼pObject2
點,而不是你只要把指針pObject2
點到Object1
,從而失去你分配的內存。
這會導致你試圖釋放你沒有分配的內存,當你指定delete
指針時,這是未定義的行爲,並且很可能會導致崩潰。
你想要做的就是使用提領操作*
上的指針pObject2
,來獲取對象的指針指向,並分配給對象,而不是:
*pObject2 = Object1;
或者使用當分配類的拷貝構造函數:
ClassName<T>* pObject2 = new ClassName<T>(Object1);
謝謝Joachim,它解決了這個問題。 –
您正在分配指針。您需要分配內容:
*pObject2 = Object1;
pObject2
是一個指針。如果指定它,則指向Object1
,忘記指向過程中動態創建的實例的指針。您需要分配實例*pObject2
。這將調用ClassName<T>::operator=
,它可以自動生成以分配所有成員,也可以手動編寫,以便爲該類型進行其他任何正確的操作。
編輯:當然,作爲圭多Kanschat中的其他問題來實現,而這是發生了什麼事你嘗試,你真的應該直接使用拷貝構造函數。無論如何,當你要用object1重新初始化它時,爲什麼用任意垃圾初始化第二個對象。
假設你有一個拷貝構造函數:
ClassName<T>* pObject2 = new ClassName<T>(Object1);
在您的代碼片段中,您首先將值分配給Object2,這些值立即丟棄。此外,您甚至會覆蓋指針本身,從而導致內存泄漏,方法是爲其分配Object1的地址,而不是將其內容分配給指向的內存。
當然!爲什麼要初始化第二個實例,如果要用對象1重新初始化它... –
這是正確的方法。然而,這並不是最好的答案,因爲它沒有告訴OP他的嘗試有什麼問題。 –
謝謝你們。軌道上的輕軌,OP有什麼問題? –
像其他人一樣,你應該使用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閱讀起來。
** N.B。**您正在詢問_assignment_,而不是_initialisation_。 –
好吧,輕軌在軌道上的比賽,我改變了它的問題。 –