在C中注解堆分配的对象

shstlldc  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(110)

当用C语言编程时,区分指向堆栈内存的指针和指向堆内存的指针是至关重要的(例如:不能使用对堆栈分配的存储器的引用来调用free)。尽管如此,C语言本身并没有提供基本的工具来限定指针,以使上述区别显式化。

是否有任何编程模式,其中人们使用称为heap的空宏定义(即#define heap)或类似的东西来用作指针限定符?

在下面的例子中,当我们看到函数的类型签名时,这种定义的实用性就变得显而易见了(当然是人为的):

int *stack_add(int *a, const int *b)
{
    *a += *b;

    return a;
}

int *heap heap_add(const int *a, const int *b)
{
    int *heap sum = malloc(sizeof *sum);

    if (sum == NULL) {
        return NULL;
    }

    *sum = *a + *b;

    return sum;
}

字符串
尽管这样一个成语很有用,但我不记得以前见过这个成语。

vc9ivgsu

vc9ivgsu1#

C中没有这样的构造,因为它完全没用。它将是非类型的,因此不可执行。因此,它和注解或“系统”匈牙利符号一样有用。(https://en.wikipedia.org/wiki/Hungarian_notation
即使这样一个结构以某种方式类型化(语言关键字而不是预处理器宏,就像一个限定符,如const),它仍然是无用的,因为它将引入两种不同类型的指针,不能混合,没有好的理由。
C语言的问题并不在于源代码中缺少一些区分堆指针和非堆指针的机制 问题在于缺少任何运行时检查,以确定您试图传递给free()的指针类型,并且即使在ASSERT()发明之后,仍然缺少任何此类运行时检查,再加上人们狭隘地坚持不使用ASSERT()以及更广泛的调试-构建-仅运行时检查概念。
您可以自己添加这样一个运行时检查工具,方法是将内置的malloc()free()替换为您自己的工具(仅在调试版本上),它返回 Package 在稍大内存块中的内存块,这些内存块包含特殊标记,以便free()可以在无意识地尝试释放您传递给它的任何内容之前进行一些健全性检查。

相关问题