c 解構函式問題,c 解構函式的問題

時間 2023-02-25 13:20:03

1樓:

1 不是不能定義,是定義了沒意義。因為建構函式不被繼承,而虛擬函式是要在派生類中重定義的2 定義虛解構函式後,由於多型,當使用基類指標指向派生類物件時,會呼叫派生類的虛構函式,然後派生類的解構函式自動呼叫基本解構函式。不是虛的話,直接呼叫基類的解構函式了。

如果派生類中有用new分配的記憶體,就無法釋放了。

2樓:匿名使用者

這種解構函式的呼叫是在你按下任意鍵之後執行的,也就是螢幕關閉之後,你看不到的。要想看到,可以用new和delete看。

c++解構函式的問題

3樓:邵寶

如果你的物件在複製的時候不適合淺複製,而且整個過程中你也不需要對它進行復制,那麼一個比較好的方法就是寫一個複製建構函式:

mystring(const mystring&);

然後不實現。沒錯就是隻寫這麼一個宣告放那邊。

另:等於號操作符同理,寫一個宣告然後不去實現它。

在沒有複製構造和等於號的情況下,對於你這個情況可以這麼寫(不知道是不是算是小小的hack了):

int main()

於是就重新在s1上呼叫了建構函式。注意:不過解構函式就需要手工呼叫了。

哦剛剛錯誤的原因忘記寫了。

你臨時構造了一個mystring物件,引數"x",然後把這個物件賦值給s1,此時s1的pstrand和臨時物件的指向同一個地方,好了臨時物件這個時候用完了析構掉了,pstrand的記憶體釋放掉了,再然後你s1要析構,好了這個時候s1對pstrand執行delete。因為這塊記憶體之前已經被臨時物件的解構函式釋放過一次,現在再釋放,必死。另外賦值給s1的時候,s1原來的pstrand沒有被釋放,直接被臨時物件的pstrand覆蓋,於是原來的pstrand就沒法釋放了,記憶體洩漏。

c++解構函式問題

4樓:匿名使用者

你new那個應該用中括號吧:

name = new char[strlen(n) +1];

5樓:匿名使用者

c++不是有std::string, 好像用c的方法在寫c++.

建議改用string class, 也許就沒問題了。

c++解構函式的問題。

6樓:夔又律風

基本可以這麼說,不過前提是你這個變數是區域性變數。new一個物件的話,必須要執行delete刪除物件時才會呼叫析構。

不過如果你的例項如果是全域性變數的話,那和new一個差不多。因為全域性變數和new物件都是在程式結束時由系統釋放,執行析構(這裡的new指的是沒用delete的)。

c++解構函式的問題

7樓:王玉豆豆

答案為b。

在新建類的物件的時候執行建構函式,**中動態新建了10個物件,所以建構函式被執行了10次,當刪除指向物件陣列的指標時,物件的解構函式被執行10次。

8樓:網友

申請了十個a類物件,在new的時候每個物件都會呼叫預設建構函式(前提是該建構函式存在),在釋放的時候每個物件的解構函式也會被自動呼叫,所以都是十次。

關於c++中的解構函式的問題

9樓:匿名使用者

a func(a a);

這個函式是傳值的方式工作的,呼叫的時候,引數會複製一份並壓棧,這裡會有一次複製構造。

返回值也是傳值的方式,也會把a複製一份到返回接收地址,這裡也會有一次複製構造。

a b; 這句有一次普通的構造。

傳遞到func中的a,return a;是最後一次使用,然後由於函式返回,彈棧,a必須得銷燬,所以在函式返回的時候會產生一次析構。

func(b).set();這裡func(b)呼叫函式得到的物件(返回的那個a)是個複製品,這句執行之後,也會彈棧(呼叫func(b)過程的棧),func(b)這個物件也會銷燬,產生一次析構。

最後,a b;這個物件,在main函式返回的時候,也需要銷燬並**記憶體,這裡也會產生一次析構。

如果還是沒有明白,建議看一下函式呼叫過程、傳值、傳引用等相關的內容。

10樓:匿名使用者

析構就相當於記憶體的釋放,用了當然要換回去。

c++解構函式問題

11樓:網友

主要是針對你下面的這個問題:

「num operator++(

」這個地方只生成一個物件,通常來說,當方法返回物件的一個例項時,會建立一個臨時物件,並通過複製建構函式複製到目標物件中。很顯然,這裡呼叫一次複製建構函式並對臨時物件進行析構是多餘的,因此在c++標準中,這裡允許省略複製建構函式(哪怕會導致不同的程式行為)。

具體你可以參考,返回值優化(return value optimization,簡稱rvo)。

12樓:匿名使用者

整個過程中只是構造了2個物件,那肯定是2次析構呀。

拷貝構造也只是產生一次構造,一個物件而已。

int main()

13樓:匿名使用者

你可以這麼理解啊,整個程式只建立了兩個num的物件,怎麼可能析構三次呢?

14樓:網友

這裡只構造了一個物件,你理解的是在一個物件 i 裡頭的操作,並不是新構造了一個物件。

c++öðµäîö¹¹º¯êýîêìâ

c++的解構函式的問題

15樓:吾嘗終日而思

bank::~bank()

追問:可是如果head後面鏈著好幾個元素,是不是應該一個一個delete掉呢?

不過要注意的是,你的建構函式或其他成員函式(非解構函式)中要對head分配記憶體空間。

16樓:濱崎步最愛

你還是給出全部**吧。

c中建構函式與解構函式的問題,C 中建構函式與解構函式的問題

你的getname函式在 你的類定義中只有getscore和getid c 關於建構函式和解構函式呼叫次數的問題 沒問題啊。引數傳遞的時候第一次拷貝構造呼叫,在函式返回的時候賦值給c2 再次呼叫了拷貝構造。析構的話 c1 c2 c 三次 傳遞引數和返回引數各一次拷貝建構函式,所以是2次 有兩個物件c...

解構函式中delete的問題

保晏然 解構函式中應該是這樣 假設char 變數名是str if str null deletestr 因為你是在成員函式中new的,有可能在你銷燬物件時str並沒有分配記憶體,而你卻檢視釋放它指向的記憶體,當然會出錯。加上if判斷後就可以避免這種情況。 燃燒的左眼 建構函式中都初始化為0了?首先指...

c 解構函式是怎麼釋放記憶體的

你在方法2中可能例項化類1時沒有初始化指標,或者指標為空,程式結束時,呼叫解構函式delete一個野指標或空指標的時候就可能會出錯了,而你把方法1的指標換成物件,在程式結束的時候,即使你沒有清理,編譯器都會幫你釋放空間的,因此不會出錯。 自動生成的只會原樣複製。如果你的類裡有一個指標,你給它分配了記...