gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:21:49 25 4
gpt4 key购买 nike

在最近的讨论中(参见对 this answer 的评论),R.. 建议永远不要为指向 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);
}

是有效的C;只有当 foo 参数另外有 restrict 限定时,它才会无效。

但是,放弃 const 似乎有些 hack-ish。

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

最佳答案

我在 6.3.2.3 中没有读到同样的东西。该段是关于隐式发生且不需要强制转换的转换。因此,从指针到 const 对象的隐式转换可能是不允许的,但这并没有说明显式转换。

转换在 6.5.4 中处理,我没有看到任何东西会限制您转换任何指向 const 的指针,它本身不是 const 符合 (void*)。相反,它说

Conversions that involve pointers, other than where permitted by the constraints of 6.5.16.1, shall be specified by means of an explicit cast.

所以我在那里读到,如果你明确地做某事,它们是被允许的。

所以我认为以下是完全有效的

char const *p = malloc(1);
free((void*)p);
<删除>6.5.4 禁止的内容如下 char *const p = malloc(1); 免费((无效*)p);/* cast 的表达式是 const 限定的 */

作为旁注,对于您的第二个想法,一个返回指向 const 限定对象的指针的库,该对象随后将由调用者负责,并没有多大用处对我来说有意义。要么

  • 库返回一个指向内部对象,那么它应该限定它指向 const 的指针有一些弱调用者没有的保护改变它,或者
  • 图书馆新鲜归还分配的对象落在调用者的责任。然后它不应该太在意是否调用者更改它,因此它可能会返回指向不合格对象的指针。如果来电者那么想要确保内容并非偶然覆盖或他可能的东西将其分配给 const 指针,对于他的用途。

关于常量正确性和不可变分配对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3999966/

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