2016-11-07 9 views
2

私はC++とnetbeansにはかなり新しく、ここでかなりの問題があります。 ビルドは常に成功していますが、私のプログラムを実行すると、RUN FAILED(終了値-1.073.740.940、合計時間:2秒)のエラーが発生します。私のコード:RUN FAILED(終了値-1.073.740.940)

Arraylist.hpp:

#include <iostream> 

namespace hfu { 

class Arraylist { 
private: 
    double* members; 
    int size; 
public: 
    Arraylist(int); 
    ~Arraylist(); 
    Arraylist(const Arraylist&); 
    double get(int) const; 
    void set(int, double); 
    Arraylist& operator=(const Arraylist&); 
    //float operator[](int); 
    friend std::ostream& operator<<(std::ostream&, const Arraylist&); 
}; 
} 

Arraylist.cpp:

#include "Arraylist.hpp" 
#include <exception> 


namespace hfu { 

Arraylist::Arraylist(int i) : size(i), members(new double[size]) { 
    for (int i = 0; i < size; i++) { 
     set(i, 0); 
    } 
} 

Arraylist::~Arraylist() { 
    delete members; 
} 

Arraylist::Arraylist(const Arraylist& other) : size(other.size), members(new double[other.size]) { 
    for (int i = 0; i < 5; i++) { 
     set(i, other.get(i)); 
    } 

} 

double Arraylist::get(int i) const { 
    if (i < 0 || i >= size) { 
     throw (std::exception()); 
    } else { 
     return members[i]; 
    } 
} 

void Arraylist::set(int i, double value) { 
    if (i < 0 || i >= size) { 
     throw (std::exception()); 
    } else { 
     members[i] = value; 
    } 
} 

Arraylist& Arraylist::operator=(const Arraylist& other) { 
    size = other.size; 
    for (int i = 0; i < size; i++) { 
     set(i, other.get(i)); 
    } 
    return *this; 
} 

// float Arraylist::operator [](int index) { 
//  return members[index]; 
// } 

std::ostream& operator<<(std::ostream& os, const Arraylist& list) { 

    for (int i = 0; i < list.size; i++) { 
     os << "[" << list.get(i) << "]"; 
    } 
    return os; 
} 

}

main.cppに:

#include "Arraylist.hpp" 

int main() { 
try { 
    auto a1 = hfu::Arraylist(10); 
    std::cout << a1 << std::endl; 
    auto a2 = hfu::Arraylist(10); 
    std::cout << a2 << std::endl; 
    auto a3 = hfu::Arraylist(10); 
    std::cout << a3 << std::endl; 

} 
catch (std::exception& e) { 
    std::cout << e.what() << std::endl; 
} 

} 

私は2つのオブジェクトを作成することができますArraylistの... ....しかしそれ以上は、それは最初の2つを印刷して失敗します....しかし、私は短いリストを作成すると、サイズ1の3と言う...それは動作します...私はそれがメモリで何かかもしれないと思う...しかし私は喪失した。アイデア?

ありがとうございます!

ところで:私は、NetBeans 8.2を使用していmingwのG ++ 6.1.0

+1

class Arraylist { private: double* members; int size; 

を変更することですか –

+2

終了値 '-1.073.740.940'は、出口値' 0xc0000374'として解釈されます。これは、Windowsコアエラーコード( 'NTSTATUS')を意味すると文書化されています。[ヒープが壊れています](http:// errorco。 de/win32/ntstatus-h/status_heap_corruption/0xc0000374 /)」を参照してください。つまり、メモリ破損のバグがあります。 'valgrind'を適用します。 'valgrind'を使うことができない場合は、実際のコンピュータを入手してください。 – zwol

+1

...あなたのコードをスキミングすると、コピーコンストラクタに明白なバグがあります: 'for(int i = 0; i <5; i ++){'それは 'i zwol

答えて

4

メンバ変数の初期化順序がない初期化子内の順序によって、クラスにその定義の順序によって定義されますリスト。実際には、コンパイラは"hfu :: Arraylist :: sizeは"警告の後に初期化されます。

memberssizeより前に初期化されるため、sizeがまだゴミである場合はnew double[size]が呼び出されます。私の場合、単にstd::bad_array_new_lengthがスローされます。あなたのケースでは、状況が悪化し、アプリケーションがクラッシュします。

だから、解決策は、デバッガを使用してコードをステップ実行するとき、あなたは何を観察しましたか?

class Arraylist { 
private: 
    int size; 
    double* members; 
関連する問題