c 關於解構函式的問題,C 關於解構函式的一個問題

2021-12-28 09:38:32 字數 1641 閱讀 5436

1樓:空雪夢見

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

mystring(const mystring&);

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

如果程式中用到了複製構造,那麼連結的時候就會報錯,可以幫助你遠離深複製淺複製的問題。

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

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

int main()

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

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

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

2樓:

沒寫,拷貝建構函式,賦值運算子函式,趕緊各寫一個!!!!

class mystring;

mystring(const char *str):length(0),pstrand(null)

else

if( pstrand)

else length=0;

return *this;

};~mystring()

void show()

private:

int length;

char *pstrand;};

3樓:天到

用指標:

int main(){

mystring *p=new mystring("abc");

p->show();

delete p;

p=new mystring("x");

p->show();

delete p;

return 0;

動態分配記憶體再刪除指標,下次用時新建

4樓:匿名使用者

1、一般應增加set函式,用set()函式附新值void set(const char *str)s1.set("x");

2、增加free函式

void free()

3、在解構函式內增加判斷語句

if(pstrand!=null) delete pstrand;

5樓:匿名使用者

哦?建構函式有返回值嗎?。。。。解構函式是釋放物件的時候才呼叫的,s1一直存在耶

6樓:浪天涯c加加

自己定義一個拷貝建構函式,應該是出現了指標懸掛的問題。。。

c 什麼是虛擬函式,構造與解構函式可以是虛擬函式嗎

虛擬函式用於實現類的繼承所體現的多型性,當一個類的成員函式被宣告為虛的,那麼這個類的派生類如果過載了這個函式,那麼在呼叫這個函式時,會先確認這個類例項是原來的類還是派生類 因為父類的指標可以指向子類 如果是父類,那麼呼叫父類的版本,如果是子類,則呼叫對應的子類的版本。class a class b ...

C 問題為什麼加上這個析構會錯誤

你賦值的時候已經delete了ch,你在解構函式中再delete一次,應該就會出錯 你的 寫的好不規範,雖然電腦編譯的過,不過別人很難讀懂,還有你的建構函式似乎有問題,stringg ch 是什麼?成員函式內部不要出現這些,直接用ch就好了,或者用this ch,還有你的函式,內部又出現了strin...

有關解構函式和const的問題謝謝了

首先,建構函式是在物件建立時執行,而解構函式是在物件消亡時執行的,也就是說,你在new一個物件的時候就執行了建構函式,delete的時候就執行了解構函式.其次,c 特有的new和delete就是為確保構造和解構函式能夠準確執行才創造的,而你用c語言的malloc和free那就不能確保構造和析構的發生...