2016-11-19 22 views
-1

カスタム文字列クラスのadd関数をオーバーロードしようとしているため、オブジェクトの長さと配列の両方を追加するために一時オブジェクトを作成しますが、セグメント化エラーが発生しますなぜか分からない。私は代入演算子と等価演算子の両方をテストしており、どちらも完全に動作しています。このループ文字列クラス+演算子

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

    p++; 
} 

が可変の反復を終了する

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-three)に準拠していますか? – MikeCAT

+1

あなたはgdbを試す必要があります:gdbでコードを実行する( 'run')、フォールトすると( 'up'を使って)認識したコードにスタックを登ります。このコードを見てください。 "p * this"を試してみてください。オブジェクトの状態を参照してください。 "p localVar" –

答えて

1

psLength -1に等しくなります。

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

ループはそのような条件を使用する理由も、それは明らかではないですあなたは

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

を持っている最初の繰り返しで

このループではこのように

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

    p++;  
} 

p != sLength - 1 。なぜ彼らはp != sLengthのような条件を使用しないのですか?

コピー代入演算子も間違っています。

たとえば、s!= NULLの場合、以前に割り当てられたメモリを削除せずにNULLを割り当てるだけです。

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

しかもsNULLに等しい場合str.sが非ヌルポインタであることができますが、あなたはそれに何を割り当てません。それはoperator +であるとして、あなたがループ

 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]; 

ここで、次の条件を使用しない理由

も疑問が生じますか?

+0

助けてくれてありがとうございます。 – yasky

+0

@yaskyいいえ、まったくありません。どういたしまして。:) –

関連する問題