2017-10-09 14 views
0

にメモリをクリアしようとしたとき、私はポインタの配列を解放する機能を書いているが、私は関数を呼び出したときに、「二重解放や破損(fasttop)」をランタイムエラーを取得しています。この関数の目的は、ファイルが既に開いていてfillArray関数が再度呼び出された場合に、入力ファイルからデータを取得する配列をクリアすることです。ここでダブル無料または破損C++

が問題の原因となっている機能である:それはどこかのプログラムで呼ばれていた場合

void freeArray(Country ** g_countryArray) 
{ 
    for (int i = 0; i < g_arrsz; ++i) 
    { 
     delete [] g_countryArray; 
    } 
} 

を、私の知る限り、それはプログラムがクラッシュする原因となります。私はデバッガを実行しましたが、出力を非常に理解するのに十分な経験はありません。それが助けになるなら、私はそれから情報を投稿することができます。

+1

同じポインタを何回も削除するのはなぜですか?これは意味がありません。一つは十分です。 2回目は未定義の動作を示します。 –

+0

問題は 'g_arrsz'が'> 1'です。それはポインタの配列ではなくポインタの配列を削除するので、あなたと関数は間違ったことをするでしょう。よく実際にあなたの問題は、C++やCを知らず、ポインタへのポインタを使用しているように見えます。待って!あなたの直ぐの問題は[mcve]の欠如です。基本的に99の問題があり、この問題はそれらをすべて修正するつもりはありません。 – Yakk

+0

より良い答えを作り出す方向に感謝します。はい、私はC++を学んでいるので、私は専門家ではありません。なぜポインターへのポインターが良くないのかもしれませんか?これはクラスの割り当てのためのものであり、ポインタへのポインタを使用することは要件の一部です... –

答えて

0

ループ本体に[i]を残しました。個々のポインタが単一のCountryオブジェクトである場合は、[]を削除する必要があります。

ありがとうございますしたいdelete[]全体の配列;それはあなたのコードの残りの部分に依存します。

+0

ああ、ありがとう。愚かなことを逃す。 –

+0

カントリーオブジェクトの配列があります。これは削除する必要があるオブジェクトなので、今すぐ達成すると思います。 –

+0

@SethTaylor:あなたのデータ型は、単一レベルの 'Country *'によって識別される 'Country'オブジェクトの配列に対応していません。 –

0

変更delete [] g_countryArray;delete g_countryArray[i];へ。

delete [] arr一度に配列全体を削除します。

+0

この文脈では、2つのステートメント 'delete [] g_countryArray'と 'delete g_countryArray [i]'は互換性がありますか? –

+0

No.互換性はありません。最初の1つ:{すべての配列要素を削除}; 2番目の要素:{delete i番目の要素}。 2番目の要素については、各要素をループする必要があります。 –

関連する問題