2012-06-11 35 views
-3

我有這個類:這是C++中的代碼內存泄漏?

class Base{ 
    private: 
     char *message; 
    public: 
     Base(string message`); 
     ~Base();  
}; 

編輯:對不起,我忘了給我的構造函數!
當我實現析構象下面這樣:

Base::Base(string message1){ 
    message = new char[message1.size() + 1] 
    message[message1.size()] = '\0'; 
    memcpy(message, message1.c_str(), message.size()); 
} 
Base::~Base(){ 
    delete message; 
} 

某個系統出錯,stop working錯誤,但如果不是delete message,我使用message = NULL,一切都會好起來的!所以,如果我只是在我的析構函數中聲明message = NULL,我的程序是否會發生內存泄漏?

+0

這聽起來令人難以置信的可疑,但沒有一個更完整的例子(即,在構造函數中發生了什麼?)沒有辦法回答它。 –

+0

你在構造函數中做什麼? – PermanentGuest

+0

哪種類型是'string'? –

回答

10

絕對沒有理由在這裏使用new。構造函數需要std::string,然後手動將其內容複製到char的新動態分配數組中。這完全沒有價值。相反,如果構造函數簡單地將其複製到另一個std::string中,則std::string複製構造函數將執行相同的操作,但有很多免費好處:異常安全,no memory leaksproper copy semantics

class Base{ 
    private: 
     string message; 
    public: 
     Base(string message); 
     // maybe a virtual destructor is desirable if this is a polymorphic base class 
     // virtual ~Base() {} 
}; 

Base::Base(string message1) : message(message1) {} 
1

使用此處顯示的代碼,沒有內存泄漏。但是,影響NULL的指針在任何情況下都不會刪除它。你只是放棄了對它的引用。

1

爲什麼要使用delete?你沒有在堆上分配內存,你只是創建一個指針。除非你在構造函數堆中分配內存,我們無法知道你選擇不共享代碼...

1

是的,這是一個內存泄漏,如果你沒有delete內存在您的構造函數中由new動態分配。

你必須使用delete[] message

5

您的問題是使用與new[]創建的東西delete。它需要一個delete[] message正確釋放字符串。

將指針設置爲NULL只是掩蓋了問題,而確實是泄漏內存。

+0

Bingo和+1。這是「有時系統出現停止工作錯誤」問題的正確答案。使用'delete'而不是'delete []'釋放通過'new []'分配的內存是未定義的行爲,並且將指針設置爲NULL(以及爲什麼麻煩?)會泄漏。 –

2

還有內存泄漏。您分配一個char陣列,所以你需要適當地刪除它,是這樣的:

Base::~Base(){ 
    delete[] message; 
} 

如果設置指針爲NULL這是無關緊要的,指針本身是反正釋放析構函數被調用後。

1

存在內存泄漏,因爲通過簡單地執行message = NULL,您只能使指針的地址無效。內存中保存的內容仍然存在,尚未刪除。