2011-03-27 58 views
0

的調試器給我「壞PTR」當我創​​造這個構造一個新的字符串數組,但只有當我的重載操作方法創建一個新的MyString對象...困惑。<bad ptr>重載+操作

這裏是我的構造

MyString::MyString() 
{ 
    stringSize = 0; 
    stringCap = 16; 
    stringArray = new char[stringCap + 1]; 
    stringArray[0] = '\0'; 
} 

這裏是我的重載操作方法

MyString operator+(const char* leftOp, const MyString& rightOp) 
{ 
    MyString result; // new object used to store result 
    result.stringSize = strlen(leftOp) + rightOp.stringSize; 
    // if the string does not fit in the array 
    if(result.stringSize > result.stringCap) 
    { 
     delete[] result.stringArray; 
     result.stringCap = (result.stringSize + 15) & ~15; 
     result.stringArray = new char[result.stringCap + 1]; 
    } 
    strcpy(result.stringArray, leftOp); 
    strcat(result.stringArray, rightOp.stringArray); 
    return result; 
    } 

這裏是我的拷貝構造函數,調試器從來沒有得到過

MyString::MyString(const MyString& s) 
{ 
    stringSize = s.stringSize; 
    stringCap = s.stringCap; 
    //stringArray[stringCap + 1]; 
    stringArray = new char[stringCap + 1]; 
    stringArray = s.stringArray; 
} 
+2

準確*該編譯器說什麼*? – 2011-03-27 19:25:23

+0

在您的拷貝構造'字符串數組= s.stringArray;'是錯誤的。改用'strcpy'。請參閱我的答案中的編輯! – Nawaz 2011-03-27 19:39:10

回答

1

因爲從您的代碼段,似乎沒有錯,我的第六感告訴我,你不寫拷貝構造函數,並用默認的編譯器生成的,或者可能stringArray正在是不是一個空值終止串!

編輯:

在您的拷貝構造函數,這是錯誤的:

stringArray = s.stringArray; //wrong! 

使用strcpy代替:

strcpy(stringArray, s.stringArray); //correct! 

確保您的所有字符串都是空終止的!

+0

我寫了一個拷貝構造函數,但是當我使用調試它從來沒有達到拷貝構造函數 – bluetickk 2011-03-27 19:30:07

+0

@bluetickk:也許,你已經正確地寫它。向我們展示代碼! – Nawaz 2011-03-27 19:30:50

+0

編輯我原來的職位與拷貝構造函數 – bluetickk 2011-03-27 19:34:16

3

那麼,當此方法返回,「結果」將被複制並且被破壞。如果析構函數刪除陣列,並沒有確保新的副本包含一個有效的新陣列智能拷貝構造函數,那麼你將有問題。

但你說的編譯說了一些關於錯誤的指針 - 在哪裏?什麼線?

+0

調試器只要此行被讀 字符串數組=新炭說壞的ptr [stringCap + 1]; – bluetickk 2011-03-27 19:29:30

+0

@bluetickk:告訴我們更多的代碼! – Nawaz 2011-03-27 19:31:46

+0

編輯我的職務與拷貝構造函數 – bluetickk 2011-03-27 19:34:35