常量正确性和不变的分配对象

Chr*_*oph 6 c pointers const

在最近的讨论(见评论这个答案),R ..建议不要为了指针-TO-别名const类型,你将不能够很容易地解除分配在标准的C程序中引用的对象(记住:free()需要一个非- const指针参数和C99 6.3.2.3仅允许从不合格到合格的转换)。

C语言显然假定存在任何已分配对象的所有者,即某人必须存储const指向该对象的非指针,而该人负责释放。

现在,考虑一个用于分配和初始化对象的库,这些对象不能通过用户空间代码进行修改,因此函数调用始终返回const合格的指针。

显然,库是对象的所有者,应该保留一个非const指针,这有点愚蠢,因为用户已经提供了一个完全有效的,但是const在每次库调用时都复制了指针的副本。

为了取消分配这样的对象,库必须丢弃const限定符;否则,必须取消限定符。据我所知,以下

void dealloc_foo(const struct foo *foo)
{
    free((void *)foo);
}
Run Code Online (Sandbox Code Playgroud)

有效的C; 仅当foo参数另外被restrict限定时才无效。

但是,抛弃const似乎有点乱。

除了从const库函数的所有返回值中删除之外,还有其他方法会丢失有关对象可变性的任何信息吗?

Nik*_*sov 2

如果对象确实是不可变的,为什么要给用户提供指向它的指针并冒损坏对象的风险?将对象地址保留在表中,将不透明句柄(整数表索引?)返回给用户并在库例程中接受该句柄。