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那就不能確保構造和析構的發生...