mallocの後freeでエラーが発生した問題

1103 ワード

今日プログラムを書く時に1つの問題にぶつかって、1つのポインタにメモリをコピーする時、いつも間違います
 memcpy(AudioSend_Stream, UdpPackageHead, 6);

メモリが開いていないことに気づきました
    AudioSend_Stream = (unsigned char *)malloc(sizeof(UdpPackageHead));

その後、問題ないことに気づき、後で思い出したのですが、システムがmalloc()/calloc()/realloc()などを使う場合は、手動freeが必要で、空にする必要があります.さもないと
メモリの漏洩の原因となります.その後、私はすぐにポインタを空にしました.しかし、次のエラーが発生しました.
invalid address or address of corrupt block 0x6b91d928 passed to dlfree
困惑して、どうして、1つの壊れた住所に空を置くことができないことを说明します???
コードにこの文を見つけました
    memcpy(AudioSend_Stream + 9, &talkdata, sizeof(talkdata));

このコードはポインタのアドレスをずらしたようで、それから私が再び解放したとき、アドレスが変わったことに気づいて、再び解放するとオフセットしたアドレスが解放されます.だから新聞を間違えた.
これを解決する方法も簡単です.この位置をオフセットする前に、同じポインタを定義し、前のポインタに割り当てます.そして元のポインタでアドレスをずらして、最後にその新しい定義のポインタを解放すればいいです.
 unsigned char*  AudioSend_Stream1 = NULL;
 AudioSend_Stream1 = AudioSend_Stream;
 memcpy(AudioSend_Stream + 9, &talkdata, sizeof(talkdata));
 free(AudioSend_Stream1);
 AudioSend_Stream1=NULL;

このようにして、エラーのアドレスを解放することを防止することができます.