2016-09-18 2 views
0

私はクラスでいくつかのいたずらなことをやろうとしていて、解決できないクラッシュを受けました。私は、データが割り当てられ、充足されるべきだとは思っていますが、割り当てられていないデータを読み込もうとしたことが原因であると私は信じています。助けて..?関数スコープクラッシュのポインタ

void read(int &n, int &m, double ** arr){ 
    fstream f1; 
    f1.open("1.txt"); //open a file to read the data from it 
    f1>>n>>m; 

    arr = new double *[n];//create an array of pointers (double) 

    for(int e = 0; e<n; e++){ 
     arr[e] = new double[m]; //assign arrays of doubles to each pointer in the array 
     for(int l = 0; l < m; l++){ 
      arr[e][l]= 0.f; //set it to 0 
     } 
    } 
    for(int e = 0; e<n; e++){ 
     for(int s = 0; s<m; s++){ 
      f1>>arr[e][s]; //read it from file 
     } 
    } 
    f1.close(); 
    cout<<arr[3][4]<<"\n"; //prints out fine (the last number in my test matrix) 
} 

int main(){ 
    double ** matrix; 
    read(n, m, matrix); //fills the matrix 
    cout<<matrix[0][0]; //crashes the program 

    return 0; 
} 

答えて

0

あなたはパラメータとしてmatrixを送信しています。値はarrにコピーされています。次にread()にメモリが割り当てられ、処理が行われます。 read()が終了すると、arrポインタが破棄されます。つまり、matrixではなく、main()に戻り、まだmatrixが割り当てられていません(デバッグモードではnullptr)。 arrread()からmain()に戻し、matrixに格納します。この場合、戻りタイプread()double**である必要があります。 delete行列が正しくmain()にあることを忘れないでください。

EDIT:

ポインタがRAMの物理メモリを有しています。 matrixには独自の物理メモリがあり、0xAAAAと呼び、arrはRAMに独自のメモリを持っています。0xBBBBとします。 matrixread()に渡されると、matrixと同じではない新しいダブルポインタがRAMに作成されます。この新しいポインタは、あなたのケースではarrによって知られています。これを確認するには、cout << &matrix;cout << &arr;を使用すると、2つの異なる場所に表示されます。今度はread()が呼び出されると、の内容matrixになります。作成後はarrにコピーされます。 read()を呼び出すときに、matrixがnull、すなわち0x0000の位置を指しているとき、コンテンツのコピーは今度はarrが0x0000またはnullの同じ位置を指していることを意味します。 cout << matrix;cout << arrを使用して確認してください。結果は同じになります。新しいメモリをarrに割り当てます。 matrixはこのメモリについて知らず、0x0000を指しています。 read()が終了すると、arrは破壊されるが、の内容arrではない。 newキーワードを使用して割り当てられたメモリは、ポインタなしで指されるようになりました。 read()が終了した後に制御がmain()に戻ると、matrixは依然として0x0000を指しています。あなたはそれにアクセスしてエラーを得たいと思う。今すぐarrによって割り当てられたメモリにmatrixを指すことができる方法がなければなりません。そうしないと、メモリリークが発生します。多くの方法があります。そのうちの1つは、arr, other is to allocate memory inの内容を返すことです。main(), process using read()and again access memory after read() `ends。

+0

また、 'matrix'はRAMの物理アドレスではありませんか?私はそれを作ることができますので、何かを返す必要はありませんか?*私は私の答えを編集し、私は**メモリリークについての詳細情報を追加しませんでした「ボンネットの下に」もの – user2468893

+0

これは原始的なものである場合、私は申し訳ありませんが、私は、ボンネットの下で起こっていただきました!知ってほしいです*と 'matrix'の正しい削除。メモリリークを避けるために、 'new'によって割り当てられたメモリを常に'削除 'するのがよい方法です。 – Awais

+0

についてのいくつかの詳細を追加してみましょうここで – Awais

0

あなたはreadarrためのメモリを割り当てますが、mainでそれを使用してみてください。 arrをoutパラメータ(nまたはmなど)として使用する場合は、参照にする必要があります。

+0

あなたは詳しく説明できますか?私はポインタがここでの参照によく似ていると思った。私は引数として 'matrix'を使って実際のアドレスを取得し、そこでそこにデータを埋めていくと仮定しました。ここでリファレンスをどのように使うべきですか? – user2468893