Ubuntu 10.10 gcc 4.4.4割り当てられたメモリが二重に解放されないように条件を設定する
私は割り振りと解放を実験しています。
ただし、オブジェクトが複数回解放されたときにこの問題を回避しようとしています。
しかし、私がテストすると、作成されて解放されたobjがnull状態に戻らないことがわかります。これが起こった場合、私が設定できる条件はありますか?
また、フリー後にオブジェクトをNULLに設定しようとしました。しかし、それはまだオブジェクトを解放しようとしました。
これは、あなたが重複しないことを知っているだけので、この質問への参照である:以下 freeing allocated memory
マイコード:
#include <stdio.h>
#include "objects.h"
int main(void)
{
obj_t *obj = NULL;
obj = create_object();
destroy_object(obj);
destroy_object(obj);
return 0;
}
==
#ifndef OBJECTS_H_INCLUDED
#define OBJECTS_H_INCLUDED
typedef struct Obj_t obj_t;
obj_t* create_object();
void destroy_object(obj_t *obj);
#endif /* OBJECTS_H_INCLUDED */
==
#include <stdio.h>
#include <stdlib.h>
#include "objects.h"
struct Obj_t {
int obj_id;
};
obj_t* create_object()
{
obj_t *obj = malloc(sizeof obj);
return obj;
}
void destroy_object(obj_t *obj)
{
if(obj != NULL) {
printf("Object [ %d ] will be deleted\n", obj->obj_id);
free(obj);
}
}
==
OBJECT_FILES = objects.o main.o
CFLAGS = -Wall -Wextra -Wunreachable-code -ggdb -O0
CC = gcc
TARGET = obj
$(TARGET): $(OBJECT_FILES)
$(CC) $(CFLAGS) $(OBJECT_FILES) -o $(TARGET)
main.o: main.c objects.c
$(CC) $(CFLAGS) -c main.c
objects.o: objects.c
$(CC) $(CFLAGS) -c objects.c
clean:
rm -f $(OBJECT_FILES) $(TARGET) *~
ポインタをNULLに設定してもう一度 'フリーズ 'しようとすると、それはノーオペレーションです。ポインタを「NULL」に戻したところはどこですか? – birryree
Cではなく(C++ではない)、 'obj_t * create_object();'のヘッダの宣言は、 'create_object()'が 'obj_t'を返す未定義でない空のパラメータリストを持つ関数であることを示しています。ポインタ。コンパイラは、パラメータリストの内容を伝えていないため、誤っていないことを保証することはできません。宣言に 'obj_t * create_object(void);'と書かなければなりません。そして、対称性のために 'obj_t * create_object(void){...}'を関数定義に書いてください。 –
@Jon、voidパラメータについてのヒントをありがとう。 – ant2009