[英]Conversion constructor
誰能告訴我在調用構造函數后如何刪除char *成員。
輸出為“調試斷言失敗”
class String
{
public:
char* m;
String()
{
m = NULL;
}
String(const char* str)
{
m = strdup(str);
}
String(const String& I)
{
m = strdup(I.m);
}
~String()
{
delete m;
}
};
void main()
{
String s;
s = "abc";
s = "bcd";
}
問題是您尚未實現賦值運算符。 所以當你這樣做
s = "abc";
您最終得到兩個String
對象(其中一個是臨時對象),該對象持有指向相同地址的指針。 他們都試圖刪除相同的對象。 您需要遵循三個規則 。
注意 :正如@kolrabi指出的那樣,您應該在分配給strdup
的指針上調用free
,而不是delete
。
讓我們分析s = "abc"
:
首先,這是一個賦值,而不是實例化,因為已經聲明了s
。
因此,為此的編譯解決方案是創建一個以"abc"
作為String
構造函數參數的臨時String
對象,然后調用String
賦值運算符以將該臨時對象復制到s
。
現在,由於尚未實現此類的賦值運算符,因此將調用默認賦值運算符,並將每個成員變量從臨時String
對象復制到s
。
最后,臨時String
對象被銷毀,並且由其m
變量指向的內存被釋放。 結果,您最終得到sm
指向無效的內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.