2016-12-10 17 views
0

オブジェクト0x7ffbaf002000でエラーが発生しました:解放されたポインターが割り当てられませんでした。しかし、私はメモリアドレスをプリントアウトしています。実際には0x7ffbaf002000allocFlights(Flight**, int)flight[0] = (Flight*) malloc(sizeof(Flight) * 60)の中の関数allocFlights(Flight**, int)に割り当てられています。だから私はこの問題を持っている理由私は理解していない私はそれがありますかどうかを確認するために機能deAllocFlights(Flight**, int)std::cout << flight[0] << std::endlのメモリアドレスをプリントアウトし、それがループ解放されたポインターが割り当てられていたにもかかわらず割り当てられていませんでした

0x7ffbaf002000であります。私はまだC++で新しいです。ここで

構造体のフライトです:

typedef struct { 
    int flightNum; 
    char origin[20]; 
    char destination[20]; 
    Plane *plane; 
}Flight; 

void getAllFlights(Flight **flight) { 
    FILE *file = fopen("reservation.txt", "r"); 
    int i = 0, totalFlights; 

    if(file == NULL) 
    { 
     perror("Error in opening file"); 
    } 

    fscanf(file, "%d\n", &totalFlights); 
    *flight = (Flight*) malloc(sizeof(Flight*) * totalFlights); 


    allocFlights(flight, totalFlights); // Allocate here 
    . 
    . 
    . 
    deAllocFlights(flight, totalFlights); // Error: Deallocate here 
    fclose(file); 
} 

機能allocFlights

void allocFlights(Flight **flight, int totalFlights) { 
    for (int i = 0; i < totalFlights; i++) { 
     flight[i] = (Flight*) malloc(sizeof(Flight) * 60); 
     std::cout << flight[i] << " " << i << std::endl; // Print out memory address 
    } 
} 

機能deallocFlights

void deAllocFlights(Flight** flight, int totalFlights) { 
    for (int i = 0; i < totalFlights; i++) { 
     std::cout << flight[i] << " " << i << std::endl; // Print out memory address 
     free (flight[i]); 
    } 
} 

メイン:

int main() { 
    Flight *flight; 
    getAllFlights(&flight); 
    free(flight); 
    return 0; 
} 
+2

1つを選択:CまたはC++。これはあなたのために多くのものを簡素化することができます。 – e0k

+1

C/C++などの言語はありません。これはC++ –

+0

あなたのコードは 'std :: cout << flight [i] << ...'を使うため、C++であることに注意してください。しかし、もしあなたがC++でコーディングしているのであれば、 'malloc()'と 'free()'を使うべきではありません - C++の優れた 'new'と' delete'演算子を使うべきです。すべて。 –

答えて

2

最初のフライトを2回割り当て解除します。 2回目に割り当てを解除すると、割り当てられていないにも割り当てが解除されているため、割り当てられていないことが示されます。 deAllocAllFlights()のフライトをすべて割り当て解除したので、最後にfree(flight);に電話する必要はありません。コメントにDavid Schwartzが述べたように、flight[0]*flightと同じ(または彼がそれを*(flight + 0)と置くので)ためです。

+0

'flight [0]'は '*(flight + 0)'に相当し、 '* flight'と同等であることを彼に思い出させるのに役立ちます。 –

+0

良い点!私は答えを更新します。 – user1118321

2

どこにも1つの星がありません。

コードは、Flight(またはFlightへのポインタへのポインタ)へのポインタの配列として、元の変数で動作します。したがって、二重星で定義されなければならない。

int main() { 
    Flight **flight; 
    getAllFlights(&flight); 
    free(flight); 
    return 0; 
} 

、すべての機能のために同じ:

void getAllFlights(Flight ***flight) { 
    ... 
    *flight = (Flight**) malloc(sizeof(Flight*) * totalFlights); 

void allocFlights(Flight ***flight, int totalFlights) { 
    for (int i = 0; i < totalFlights; i++) { 
     // dereference the pointer first and then access array: 
     (*flight)[i] = (Flight*) malloc(sizeof(Flight)); 

void deAllocFlights(Flight*** flight, int totalFlights) { 
    for (int i = 0; i < totalFlights; i++) { 
     std::cout << (*flight)[i] << " " << i << std::endl; // Print out memory address 
     // dereference the pointer first and then access array 
     free ((*flight)[i]); 

元のコードがmain関数で定義された変数に直接ポインタをアクセスしたようにそれを使用しそれはインデックス1の変数の背後にあるアドレスに行き、それ以上のインデックスを持つことを意味しました。

また、flightsは、実際に配列されているように、変数と他のすべてのパラメータの方がはるかに優れています。それはコードをより明確にし、潜在的にこのような間違いを避ける良いチャンスを与えます。

+0

「飛行機」が何であるかわかりません。それが非PODタイプの場合、このコードは正しく動作しません。 – PaulMcKenzie

+0

@PaulMcKenzie:それはPODです。タイプは質問に定義されています。しかし、それがなかったとしても、少なくとも現時点で提示されている部分は、コードが動作していたはずです。メモリとメモリが無料であり、メンバ(明らかに初期化されていない)やそのようなものにアクセスできません。 –

+0

'(Flight *)malloc(sizeof(Flight)* 60);' 'Flight'がPODタイプでない場合、これは機能しません。コードはハリウッドよりも星が多い。 – PaulMcKenzie

関連する問題