C 中的 const 和销毁责任

问题描述 投票:0回答:2

假设我有第一个结构类型

a_t
和第二个结构类型
b_t
,并且
b_t
的一个字段是指向
a_t
实例的指针。我有创建和销毁功能:

void b_t_create(a_t* a_t_instance) {
   b_t_instance = (b_t*) malloc(sizeof(b_t));
   b_t_instance.a_t_instance = a_t_instance;
   return b_t_instance;
}

void b_t_destruct(b_t* b_t_instance) {
   free(b_t_instance->a_t_instance);
   free(b_t_instance);
}

因此,销毁责任从

a_t
转移到
b_t
......我的问题是;是否建议使用
const
和 de-
const
重写第一个函数,如下所示?

void b_t_create(const a_t* a_t_instance) {
   b_t_instance = (b_t*) malloc(sizeof(b_t));
   b_t_instance.a_t_instance = (a_t*) a_t_instance;
   return b_t_instance;
}

乍一看,这似乎很合理,因为函数本身并没有触及

a_t_instance
。另一方面,它秘密地把它交给了稍后会破坏它的东西,因此,实际上并不是那么秘密,我们内部有一个 de-
const
转换,因为结构体字段
a_t_instance
是类型
a_t*
,鉴于不可避免的破坏......

c constants
2个回答
0
投票

在 C 语言中,当函数接收到指向动态对象的指针时,它可以“借用”它,这意味着它将使用它,但调用者仍将负责以后的销毁,或者“窃取”它并取得所有权物体。在后一种情况下,调用者不再对以后的销毁负责。在更常见的用例中借款和盗窃应记录在案。 这里 b_t_create 函数

窃取

指针。通常使用 const 来表示该对象不会被更改(对于编译器和函数的用户来说)。由于该对象现在打算稍后在

b_t
销毁时被删除 而无需对对象本身进行任何操作,因此您不能说它保持不变。因此你不应该将它声明为 const。
    
编写一个程序,对两个整数 a、b 执行 +、−、*、/、% 的计算。 唯一包含两个数字 a、b 且满足 −109 ≤ a、b ≤ 109 的行 , b ̸= 0.


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.