2016-04-26 12 views
0
//prototype  
void Split(char c, vector <MyString> &outputVector) const   

//partial code inside split function 
// create new MyString object to push into output vector 
MyString substr; 
substr.mString = newString; 
substr.mLength = size; 

// push new item 
outputVector.push_back(substr); 

outputVector.push_back()行をステップ実行すると、mStringデータメンバーは保持されません。ベクターへベクターにpush_back構造体を挿入

enter image description here

//I have two constructors 
MyString() 
{ 
    mString = NULL; 
    mLength = 0; 
} 

/************************************************* 
* MyList copy constructor 
* creates a deep copy of a MyString item 
************************************************/ 
MyString(const MyString &copy) 
{ 
    mString = new char[copy.mLength]; 
    int i; 

    for(; i < copy.mLength; i++) 
    { mString[i] = copy.mString[i]; } 

    mString[i] = '\0'; 
    mLength = copy.mLength; 

} 
+6

ようこそスタックオーバーフロー! ** [編集] **あなたの質問は[mcve]または[SSCCE(ショート、自己完結型、正しい例)](http://sscce.org) – NathanOliver

+1

私たちに 'MyString'の定義を表示してください –

+2

あなたは何ですか* MyString'クラスの[3,5または0のルール](http://en.cppreference.com/w/cpp/language/rule_of_three)に従ってください。標準の 'std :: string'クラスを使用しない理由はありますか? –

答えて

6

にあなたは私たちは何が起こっていることができますが、最も可能性の高いiれるものi見当がつかないここundefined behavior

int i; 

for(; i < copy.mLength; i++) 

で初期化されていない変数を使用していますcopy.mLengthより大きいので、forループを入力することはありません。正しい動作を得るためにあなたは私たちがそのラインi == copy.mLengthに達するが、配列が唯一の私たちはあるのでcopy.mLengthの大きさを持っている時間によって

mString[i] = '\0'; 

と別の問題が発生している

int i = 0; 

のように0にiを設定配列は0のインデックスに基づいています。ほとんどの場合、割り当てをヌルターミネータのスペースに変更する必要があります。

mString = new char[copy.mLength + 1]; 

+0

それはそれを完全に固定しました!ありがとうございました! –

0

http://www.cplusplus.com/reference/vector/vector/push_back/

一backコピー値。 MyStringクラスはmStringメンバをコピーするコピーコンストラクタを正しく定義していますか?私はこれがあなたの問題かもしれないと思います。

+1

答えは推測ではありません。 OPが実際にコードを提供したので、彼らはコピーコンストラクタを持っていますが、それはUBを持っています。 – NathanOliver

+0

申し訳ありません - コード全体が提供される前に返信されました。 –

-1

コピーコンストラクタの正しいバージョン

MyString(const MyString &copy) 
{ 
    mString = new char[copy.mLength + 1]; 
    int i = 0; 

    for(; i < copy.mLength; i++) 
    { mString[i] = copy.mString[i]; } 

    mString[i] = '\0'; 
    mLength = copy.mLength; 

} 
+0

ダウン投票の理由は何ですか? – Sumeet

0

私は、あなたが 1.for行っている2つのミスがあると思います(; I < copy.mLength;私は++){ mString [I] = copy.mString [i]は、 } ループがどこで始まるか言及する必要があります。 2.mString =新しいchar [copy.mLength + 1]; mString [i] = '\ 0'; 私はあなたが答えを持っていると思う:

関連する問題