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的指標換成物件,在程式結束的時候,即使你沒有清理,編譯器都會幫你釋放空間的,因此不會出錯。 自動生成的只會原樣複製。如果你的類裡有一個指標,你給它分配了記...