gcc (GCC) 4.7.0
c89
こんにちは、
ここで正しく考えているのだろうか。mallocを使用してメモリを割り当てる場合。mallocは、メモリ内のサイズへのポインタを返します。
したがって、メモリを割り当てる前に、すべてのポインタの値はNULLになります。
このコードスニペットの使用:
struct address *db_row = NULL;
db_row = malloc(sizeof(struct address));
db_row->name = malloc(sizeof(char) * 10);
db_row->email = malloc(sizeof(char) *10);
free(db_row->name);
free(db_row->email);
free(db_row);
メモリを割り当てる前に、db_rowのgdbデバッガーでこれを実行しました。
(gdb) p db_row
$20 = (struct address *) 0x0
(gdb) p *db_row
Cannot access memory at address 0x0
メモリアドレスが割り当てられていないので、これは正しいです。メモリを割り当てた後、同じことをすると次のようになります。
(gdb) p db_row
$25 = (struct address *) 0x602310
(gdb) p *db_row
$26 = {id = 0, set = 0, name = 0x0, email = 0x0}
ただし、メモリを解放した後も同じメモリアドレスを取得しますが、メモリを割り当てる前の最初のケースのようにNULLにすべきではありませんか?
メモリを解放した後:
(gdb) p db_row
$28 = (struct address *) 0x602310
(gdb) p *db_row
$27 = {id = 6300480, set = 0, name = 0x602330 "", email = 0x602350 " #`"}
まだ同じメモリ位置を指していることがわかりますが、これは正しいですか?
最後に、これを最後に追加して、ダブルフリーを実行できるかどうかを確認しました。
if(db_row != NULL) {
free(db_row);
}
if(db_row != NULL) {
free(db_row);
}
freeへの2回目の呼び出しでスタックダンプを取得します。しかし、安全対策として、ダブルフリーをしようとしていないことを常に確認する必要がありますか?
ポインタを解放した後、ポインタをNULLに設定する価値はありますか?
db_row = NULL;
提案をありがとう、