【发布时间】:2020-02-16 09:28:17
【问题描述】:
前几天我几乎问了同样的问题,但在 c++ 的上下文中。
我尝试在我的 c 编程中复制析构函数和构造函数。这意味着对于每个对象或结构,都有一个初始化函数和一个析构函数,它们可以像这样释放所有对象资源:
struct MyObject {
struct string a;
struct string b;
struct string c;
};
void ConstructMyObject(struct MyObject *obj) {
ConstructString(&obj->a);
ConstructString(&obj->b);
ConstructString(&obj->c);
}
void DestructMyObject(struct MyObject *obj) {
DestructString(&obj->a);
DestructString(&obj->b);
DestructString(&obj->c);
}
destruct 函数在每个函数作用域的末尾被调用,就像在 Rust 中一样,只是我手动将它放在那里而不是编译器为我做这项工作。所以现在在DestructMyObject 函数中,我调用每个结构字符串类型的析构函数,因为对于结构字符串对象,我也会像为结构 MyObject 对象一样编写一个析构函数。所以struct MyObject分配的所有东西都会被释放。
我的问题示例:
int main {
struct MyObject Object1;
ConstructMyObject(&Object1);
...
...
...
TransferOwnershipFunction(Object1.b); /*takes a struct string object as argument*/
...
...
...
DestructMyObject(&Object1);
return 0;
}
我将 Object1 的成员(结构字符串 b)的 ownernip 转移到另一个函数。但是struct string b 将被main 函数释放,因为我有一个规则,当一个对象超出范围时,我调用它的destruct 函数。但我不希望 main 函数释放此资源。 TransferOwnershipFunction(...) 现在负责释放 object1 的这个成员。 Rust 编译器如何处理这种情况?在 Rust 中,我是否必须克隆字符串 b?
【问题讨论】:
标签: c memory-management destructor ownership