【发布时间】:2011-05-14 05:55:56
【问题描述】:
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并再次尝试free它是空操作。你在哪里将指针设置回NULL? -
请注意,在 C(但不是 C++)中,
obj_t *create_object();的标头中的声明表示create_object()是一个函数,其参数列表未定义 - 非空 - 返回一个obj_t指针。编译器无法确保您不会误称它,因为您没有告诉它参数列表应该是什么。你应该在声明中写obj_t *create_object(void);,然后为了对称,在函数定义中写obj_t *create_object(void) { ... }。 -
@Jon,感谢您提供有关 void 参数的提示。