1

我有一个结构,比如

 typedef struct {
    void* data;
    int index;
 } Node;

我有一些像

 Node* node = (Node*)malloc(sizeof(Node));
 enqueue(&list, node);

然后我有一个功能:

delete_node(Node* node) {
   free(node->data);
   free(node);
}

考虑free(node->data);。如果data是指向堆数据的指针,那很好,但如果是引用,那就有问题了。我将如何处理?(标签已经很明显了,但只是为了强调一点:这不是 C++ 问题。)

4

2 回答 2

3

首先,C 没有引用,所以让我们停止使用那个特定的术语。

我相信您要问的是,您如何知道指针是指向由malloc(或其表亲之一)分配的东西,还是指向自动存储持续时间分配的对象。

答案是; 你不能。提供分配nodes 的函数并记录必须使用这些函数。如果它们不是并且客户端传入,例如,指向本地的指针,则行为未定义。所以,你有类似...

node *alloc_node(size_t size);
void  free_node(node *node);

如果我将 a 传递Node*free_node未分配的alloc_node,则行为未定义,这是我的错。这是 C 语言中非常常见的习语。

想想看;free有同样的问题,对吧?您当然可以执行以下操作:

int main()
{
    int i = 0;
    free(&i);
    return 0;
}

好吧,free不在乎。即使它这样做了,它也无法检测到这种情况。责任在你(我们)身上。如果您以不打算使用的方式使用它,则行为是未定义的,您将得到应得的。

于 2013-05-15T21:38:48.770 回答
0

没有(便携式)方法可以判断指针是否指向通过或malloc变量分配的内存。您将需要设计您的代码,以便只为成员分配调用的结果。 staticautodatamalloc

于 2013-05-15T21:41:50.997 回答