gpt4 book ai didi

c - 为堆分配的对象丢弃 `const` 是否合法/安全?

转载 作者:行者123 更新时间:2023-12-04 11:50:25 24 4
gpt4 key购买 nike

我的用例如下。

我开发了一个库,其中一些加载的插件可以创建对象(由库使用 malloc() 分配),而其他一些插件可以读取这些对象的属性,但不能修改它们。

对我来说,这是一个非 const 的情况用于创建/写入方的 API 和 const阅读器端的API,例如:

// writer API
struct obj *obj_create(void);
void obj_set_some_property(struct obj *obj, int property);

// reader API
int obj_get_some_property(const struct obj *obj);

图书馆类型转换 struct obj * (由作者方创建)到 const struct obj * (读者方可用)。

我的问题是这些对象也有引用计数,读取器端可以调用典型的引用计数递增/递减函数。这些函数需要修改对象。

我的问题是:在这个特定的上下文中,引用计数递增/递减函数接受 const struct obj * 是否安全?并抛弃const内部?请注意,如果计数达到零,引用计数递减函数也可能会销毁(释放)对象。

我知道§6.7.3¶5 说:

If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.

我就是不明白使用 const 限定类型定义意味着什么。如果我的对象是堆分配的,这是否适用?例如,我完全理解为什么 UB 使用文字字符串指针( .rodata )来这样做。但是,如果创建的对象不是 const 该怎么办?一开始?

strchr() 是一个众所周知的类型转换示例 const离开:它接受 const char *并返回char * ,它指向const char *内范围。考虑到 §6.7.3¶5,这如何合法?

最佳答案

malloc 分配的对象没有任何类型,更不用说 const 限定的类型了。无论您在某个阶段是否使用指向 const 的指针指向对象,都可以修改它们。

“使用 const 限定类型定义”要求对象具有定义(malloc 是函数调用,而不是定义)。

关于c - 为堆分配的对象丢弃 `const` 是否合法/安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53568990/

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