看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《LRM (小烏龜)》之銘言: : 我想要實作一個類似string的類別 : 想法如下: : class CMyString { : public: : CMyString(); : ~CMyString(); : char * m_pBuffer; : unsigned int m_nLength; : }; : CMyString::CMyString() : : m_pBuffer(NULL), m_nLength(0) : {} : CMyString::~CMyString(){ : if(m_pBuffer) delete [] m_pBuffer; : } : 結果,當參數傳值呼叫函式時,會發生問題! : 比如說: 推文好累 回文好了 問題點是在於 你沒有定義copy Constructor 這邊呼叫會以"預設copy Constructor方式"呼叫 意思就是你裡面放什麼複製一份 可是你裡面是char * m_pBuffer; 這是個指標 所以意思是什麼 他會把位址直接複製進去 裡面的char * m_pBuffer;放的是外面的CMyString的char * m_pBuffer;的位址 你再離開fnx的時候destructor會去free你複製進去的位址 就發生悲劇了 所以你要的是定義copy Constructor 定義new一個新的char * m_pBuffer; 應該講的很清楚了 很多人會犯這種錯誤 : void fnx(CMyString str){ : return; : } : 離開fnx時,~CMyString()會把str的m_pBuffer刪除掉!這不是我想要的結果! : 目前我的暫時解法是將參數傳址或指標, : 改成void fnx(CMyString * str)來避免呼叫~CMyString() : 不過,使用CString 或 string,好像就沒這方面的困擾? : 比如說: : void fnx(string x){ : return; : } : void main(){ : string a; : fnx(a); : } 這邊就是因為有copy Constructor 不再贅述 : 工作正常,a並沒有被刪除 : 好奇整個string的架構是怎麼辦到可以傳值呼叫的? : 這樣子不會造成memory leak嗎? : 還是它有自己的一套free()隱藏在背後? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.247.154 ※ 編輯: ianfang 來自: 140.116.247.154 (11/03 10:54)
LRM:十分感謝!:p 11/05 13:23