簡體   English   中英

轉換構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM