我有一个结构,比如
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++ 问题。)
最佳答案
首先,C 没有引用,所以让我们停止使用该特定术语。
我相信您要问的是,您如何知道一个指针是指向由 malloc
(或其表兄弟之一)分配的东西,还是一个分配有自动存储持续时间的对象。
答案是;你不能。提供用于分配 node
的函数,并记录必须使用这些函数。如果它们不是并且客户端传入,比如说,一个指向本地的指针,则行为是未定义的。所以,你有类似...
node *alloc_node(size_t size);
void free_node(node *node);
如果我将一个 Node*
传递给 free_node
而它不是用 alloc_node
分配的,行为是未定义的,这是我的错。这是 C 中很常见的习惯用法。
想一想; free
也有同样的问题吧?你当然可以这样做:
int main()
{
int i = 0;
free(&i);
return 0;
}
好吧,free
不在乎。即使它做到了,也没有什么(理智的)可以检测到这种情况。责任在你(我们)身上。如果您以不打算使用它的方式使用它,则该行为是未定义的,您得到了您应得的。
关于c - 释放引用还是释放指针?我们能判断一个参数是引用还是指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16575258/