设置条件以避免双重释放已分配的内存

ant*_*009 0 c malloc free

Ubuntu 10.10 gcc 4.4.4

我只是在尝试分配和释放.

但是,当一个对象被多次释放时,我试图避免这个问题.

但是,当我测试时,我注意到创建和释放的obj没有返回到null状态.那么有什么条件我可以设置,如果这确实发生将避免?

我也试过在free之后将对象设置为NULL.但是,它仍然试图释放该对象.

这是对这个问题的引用,只是让你知道不重复: 释放已分配的内存

我的代码如下:

#include <stdio.h>
#include "objects.h"

int main(void)
{
    obj_t *obj = NULL;

    obj = create_object();

    destroy_object(obj);

    destroy_object(obj);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

==

#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 */
Run Code Online (Sandbox Code Playgroud)

==

#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);
    }
}
Run Code Online (Sandbox Code Playgroud)

==

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) *~
Run Code Online (Sandbox Code Playgroud)

And*_*per 5

问题是指针的值Main永远不会更新,因为您将指针的副本传递给destroy_object.你需要的是指向指针的指针.试试这个:

void destroy_object(obj_t **obj)
{
    if(*obj != NULL) {
        printf("Object [ %d ] will be deleted\n", *obj->obj_id);
        free(*obj);
        *obj = NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

destroy_object(&obj);
Run Code Online (Sandbox Code Playgroud)