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

标签 c pointers free

我有一个结构,比如

 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/

相关文章:

c++ - 如何声明已在类中声明的 char 变量的 Char 数组?

c++ - 当一次只需要一个类型时,保持指向不同类型的指针的最佳方法是什么?

c - 如何在 glibc 中检测到双重释放?

c - 函数中使用的自由变量返回后出现段错误

c - C 编程中的段错误...通过或失败程序最后是通过和失败学生的列表

C - 二维数组中的移动顺序以获得最大收集总和

c - 返回值3221225725,可能缓冲区溢出?

c - 将 void 指针传递给接受非 void 指针的函数是否安全?

c - 程序编译无误但不执行数组赋值函数C lang

c++ - 强制 Windows 释放分配的内存