2012-04-14 90 views
4
matrix m1(5,5); 
matrix m2(5,5); 
m1 = matrix(m2); 

對於上面的代碼(對於任意類,矩陣),將m2的信息複製到它時,將調用析構函數以獲取與m1相關的信息?析構函數調用(堆棧)變量之間的賦值?

+3

這正是調試器所擅長的。 – 2012-04-14 02:34:18

+0

或者一個簡單的調試輸出。 – chris 2012-04-14 03:01:30

回答

5

否,賦值運算符將需要處理的釋放任何資源m1執行任務之前,可能持有。只有在m1即將超出範圍時纔會調用析構函數。

1

我認爲這取決於matrix是否正確實現了析構函數以及如何實現賦值運算符。如果矩陣有一個工作析構函數並且矩陣使用「賦值交換」(類似於複製交換習語),那麼是的M1應該被正確釋放。

要補充的,你打電話M1 = M2時,並不真正需要的基質(M2)。這只是調用複製構造函數,然後將臨時副本分配給m1。因此,無用的工作正在發生。

+0

爲什麼選擇倒票? – keelerjr12 2012-04-14 02:56:22

+0

可能會調用某個臨時對象的析構函數,該臨時對象存儲m1的前一個值,但不應調用m1的析構函數。 – Cosyn 2012-04-14 05:33:35

+0

如上所述,如果存在有效的析構函數和複製構造函數,則賦值運算符將能夠釋放m1的內容。問題是m1會在賦值時被釋放,而不是在離開scope時......請參閱:http:// stackoverflow。COM /問題/ 276173 /什麼 - 是 - 你最喜歡-C編碼的風格,成語/ 2034447#2034447 – keelerjr12 2012-04-14 05:39:19

3

不,構建一旦它在棧上分配的對象是不是解構,直到它超出範圍或顯式調用析構函數(你可能應該永遠不會做)。因此,在這種情況下,如果矩陣定義了重載運算符=(const矩陣& rhs)成員函數,則調用operator =(),並將rhs複製到m1中。否則,使用默認分配,它將所有成員變量從臨時矩陣(m2)對象複製到m1中,覆蓋這些變量的先前值。

1

什麼是這個矩陣的容器?如果是價值觀,那麼沒有問題。如果它是智能指針,那麼沒有問題。

但是如果涉及普通的指針呢?那麼這完全取決於matrix::operator=(const matrix&)的實施。如果需要在那裏調用任何析構函數,它應該調用它們。它不是通過魔法發生的,你必須考慮這些事情。

在一般情況下,這是一個壞主意,用普通的容器類持有普通指針。如果析構函數未被調用,則會泄漏內存。如果調用析構函數,如果通過另一個指針訪問同一對象,則會崩潰。 (試想一下,如果你有兩個矩陣既包含指向同一個對象。)

既然是困難和危險的使用普通的容器類來處理普通指針的容器。專用容器或專用指針應該用於此目的。

升壓,例如,包含specialized container classes專門用於保持指針。 Boost也有一個shared pointer class,可以用普通的容器包裝。

你只需要決定會發生什麼。如果你這樣做a=b;,應該ab指針指向相同的基礎對象?或者是否應該爲a創建新對象以指向內部?