2016-11-19 73 views
-1

我有這個問題,在我試圖重載爲我的自定義字符串類的附加功能,所以我做一個臨時對象到兩個物體的長度和數組的加在一起,但我不斷收到分段錯誤我不知道爲什麼。我測試了我的作業操作員作品和我的平等操作員,他們都完美地工作。String類+運營商

myString myString::operator+(const myString& str) const{ 
int p = 0; 
myString tmp; 
tmp.sLength = sLength + str.sLength; 
tmp.s = new char[tmp.sLength]; 
while (p != (sLength - 1)) 
{ 
    tmp.s[p] = s[p]; 

    p++; 
} 

while (p != (tmp.sLength - 1)) 
{ 
    tmp.s[p] = str.s[(p - sLength)]; 

    p++;  
} 


return tmp; 
//tmp.s = NULL; 
    } 
    myString& myString::operator=(const myString& str) 
{ 
    if (this != &str) 
    { 
    if (s != NULL) 
    { 
     if (str.s == NULL) 
     { 
      sLength = 0; 
      s = NULL; 
     } 
     else 
     { 

       delete [] s; 

      s = new char [str.sLength]; 
      sLength = str.sLength; 
      for (int i = 0; i < sLength; i++) 
      s[i] = str.s[i]; 
     } 
    } 
} 
return *this; 
} 
+2

請發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。你的代碼是否符合[The Rule of Three](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-reeree)? – MikeCAT

+1

您需要嘗試gdb:在gdb中運行代碼('run'),當它發生故障時,爬上堆棧以識別代碼(使用'up')。看看這個代碼。嘗試「p * this」,看你的對象的狀態,或「p localVar」 –

回答

1

當此循環

while (p != (sLength - 1)) 
{ 
    tmp.s[p] = s[p]; 

    p++; 
} 

結束其迭代變量p將等於sLength -1

因此,在這個循環中

while (p != (tmp.sLength - 1)) 
{ 
    tmp.s[p] = str.s[(p - sLength)]; 

    p++;  
} 

在第一次迭代你有

tmp.s[sLength -1] = str.s[(sLength -1 - sLength)]; 

tmp.s[sLength -1] = str.s[(-1)]; 
           ^^^^ 

而且目前尚不清楚爲什麼循環使用這樣的p != sLength - 1條件。爲什麼他們不使用p != sLength這樣的條件?

複製賦值運算符也是錯誤的。

例如,如果s!= NULL你只是分配給它NULL,而不刪除先前分配的內存。

if (s != NULL) 
{ 
    if (str.s == NULL) 
    { 
     sLength = 0; 
     s = NULL; 
     ^^^^^^^^ 

而且如果s等於NULL,然後分配給它雖然沒有什麼可以str.s是一個非空指針。

另外一個問題是,爲什麼你在循環

 for (int i = 0; i < sLength; i++) 
         ^^^^^^^^^^^ 
     s[i] = str.s[i]; 

代替

 for (int i = 0; i < sLength - 1; i++) 
         ^^^^^^^^^^^^^^^ 
     s[i] = str.s[i]; 

,因爲它是在operator +這裏使用以下條件?

+0

感謝您的幫助 – yasky

+0

@yasky根本沒有。不用謝。:) –