2017-08-23 8 views
1

私はこの小さなテストプログラムを書いていますが、問題はプログラムが終了し、forループの後でクラッシュすることです。誰かが原因を説明することはできますか?私は動物が26匹が C++反復処理後のオブジェクトの破損に関する問題

  • 表示AZアルファベット順に各動物のオブジェクトの名前を設定し
  • オブジェクトのメモリを割り当て
  • オブジェクトのための指針を作成

    1. を達成したい何

      各動物オブジェクトの名前

    2. デストラクタを呼び出すことによって割り当てられたすべてのメモリを削除する
    3. あなたはどのリード境界の外にアクセスしている
    4. for (int i = 0; i < numberAnimals; i++, test++) 
      

      から

    ソース

    #include <iostream> 
    using namespace std; 
    
    class Animal { 
    private: 
        string name; 
    public: 
        Animal() { 
         cout << "Animal created." << endl; 
        } 
        ~Animal() { 
         cout << "Animal destructor" << endl; 
        } 
    
        void setName(string name) { 
         this->name = name; 
        } 
        void speak() { 
         cout << "My name is: " << name << endl; 
        } 
    }; 
    
    int main() { 
    
        int numberAnimals = 26; 
    
        Animal *pAnimal = new Animal[numberAnimals]; 
    
        char test = 97; // a 
    
    
        cout << "========================================================" << endl; 
    
        for (int i = 0; i <= numberAnimals; i++, test++) { 
    
         string name(1, test); 
    
         pAnimal[i].setName(name); 
         pAnimal[i].speak(); 
    
        } 
    
        cout << "========================================================" << endl; 
    
        delete[] pAnimal; 
    
        return 0; 
    } 
    
  • +5

    境界を確認してください。あなたが26よりも適度な量(1つか2つのようなもの)で始めるなら、あなたはおそらく、予想以上の動物チャッターに気づいたでしょう。 – molbdnilo

    +1

    そして '97 'の代わりに' 'a''を書いてください。不可能な文字エンコーディングを覚えておく必要はありません。 – molbdnilo

    答えて

    2

    変更

    for (int i = 0; i <= numberAnimals; i++, test++) 
    

    メインの出口未定義の振る舞いに

    1

    配列要素には0からlength-1までの番号が付けられます。最初は0、最後は-1です。 C++では、配列の最初の要素は常にゼロ(ないもの)で番号及び最後の要素は、長さ1(ない長さ)である

    にあなたの次のコード

    for (int i = 0; i <= numberAnimals; i++, test++) { 
    
         string name(1, test); 
    
         pAnimal[i].setName(name); 
         pAnimal[i].speak(); 
    
        } 
    

    を変更します

    for (int i = 0; i < numberAnimals; i++, test++) { 
    
         string name(1, test); 
    
         pAnimal[i].setName(name); 
         pAnimal[i].speak(); 
    
        } 
    
    関連する問題