→ LRM:十分感謝!:p 11/05 13:23
※ 引述《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)