程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> 運算符重載-C++ 操作符重載的內存釋放問題

運算符重載-C++ 操作符重載的內存釋放問題

編輯:編程解疑
C++ 操作符重載的內存釋放問題

=操作符重載,給復構造函數進行賦值時的代碼如下:

MyString & MyString::operator =(const MyString &str)
{
if(this == &str)
return *this;

    delete []m_pData;    //**???????????????????????????? **
    m_pData = NULL;

    m_pData = new char(strlen(str.m_pData) + 1);
    strcpy (m_pData, str.m_pData);

    return *this;

}

class MyString
{
public:
....
private:
char *m_pData;
}

在函數中為什麼還要是對原有的內存進行釋放,即delete []m_pData,直接賦值 m_pData = str.m_pData, 這樣不行嗎?

請大神指點。

最佳回答:


有兩個問題:
1. 如果不delete,那麼m_pData重新賦值後,原先指向的的內存不能被訪問,也沒有被回收給程序繼續使用,相當於你的內存就減小了一塊,也就是內存洩漏。
2. 不管是否delete,執行m_pData = str.m_pData都是錯誤的。因為這樣,兩個指針指向的是同一片地址,例如你執行str1 = str2,如果按你的方式來實現,那麼以後修改str2中的字符串時,由於str1中的m_pData也指向同一片區域,因此str1中的字符串也會被修改。一般來說,這不是我們希望看到的結果。
類似於這樣:

int a = 1, b = 2;
a = b;
b = 3;

那麼我們希望此時a的值等於2,而不是3。如果執行了b = 3之後,a的值也變成了3,那自然是不符合預期的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved