2016-04-16 11 views
0

現在のオブジェクトのコピーを作成し、それを後で私がアクセスできる配列の中に格納したいと考えています。オブジェクトのコピーを作成する

私はarr配列内のintを追加していたクラス

class Purpose{ 
public: 
    Purpose(){ 
    max   = 5; 
    elements  = 0; 
    obj_elements = 0; 
    arr   = new int[max]; 
    } 
    Purpose(const Purpose &a){ 
    max   = a.max; 
    elements  = a.elements; 
    obj_elements = a.obj_elements; 
    arr   = new int[elements] 
    for(int i = 0; i < elements; i++){ 
     arr[i] = a.arr[i] 
    } 
    } 

Add(){ 
    Purpose *tmp = new Purpose(*this); 
    arr_two[ obj_elements++ ] = tmp; 
} 
private: 
    int max; 
    int elements; 
    int obj_elements; 
    int *arr; 
    Purpose *arr_two[2]; 
} 

を持っています。 Add()メソッドは、現在のオブジェクトのコピーを作成し、arr_two配列内に格納しますが、コピーしたオブジェクトの要素を印刷する場合は、seg faultがスローされます。

void Purpose::Print_It(){ 

     cout << arr_two[ obj_elements - 1 ] -> max << endl; 
     cout << arr_two[ obj_elements - 1 ] -> elements << endl; 
     cout << arr_two[ obj_elements - 1 ] -> obj_elements << endl; 
     for(int i = 0; i < arr_two[ obj_elements - 1 ] -> elements ; i++){ 
     cout << arr_two[ obj_elements - 1 ] -> arr[i] << endl 

     } 

    } 

arrの要素を印刷すると、エラーが発生します。他の属性は問題なく印刷されます。

アレイの値を印刷しているときに、プログラムがクラッシュ/セグフォールトを起こす原因は何ですか?配列の値をAdd()メソッドの中に出力すると動作します。

+3

このコードのすべての側面は、まったくひどく不注意です。これらの理由がありますか、なぜ 'std :: vector 'を使用してそれを行うことができないのですか? –

+0

私はベクトルを使わずに練習したいと思います。 – Darlyn

+1

練習中の場合は、自分のデバッグを行う練習を含める必要があります。 :) – nobar

答えて

1

サイズが0の新しい[]演算子を呼び出します(要素は0に初期化されます)。 size_tのパラメータに関しては新たな[]オペレータにcplusplus websiteから

この引数がゼロである場合、このポインタを逆参照することにつながるが、機能はまだ(成功した別個の非NULLポインタを返します未定義の動作)。

関連する問題