gpt4 book ai didi

c - 释放引用还是释放指针?我们能判断一个参数是引用还是指针吗?

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:17 26 4
gpt4 key购买 nike

我有一个结构,比如

 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com