假设我有第一个结构类型
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 语言中,当函数接收到指向动态对象的指针时,它可以“借用”它,这意味着它将使用它,但调用者仍将负责以后的销毁,或者“窃取”它并取得所有权物体。在后一种情况下,调用者不再对以后的销毁负责。在更常见的用例中借款和盗窃应记录在案。
这里 b_t_create
函数
指针。通常使用 const 来表示该对象不会被更改(对于编译器和函数的用户来说)。由于该对象现在打算稍后在
b_t
销毁时被删除 而无需对对象本身进行任何操作,因此您不能说它保持不变。因此你不应该将它声明为 const。编写一个程序,对两个整数 a、b 执行 +、−、*、/、% 的计算。 唯一包含两个数字 a、b 且满足 −109 ≤ a、b ≤ 109 的行 , b ̸= 0.