【发布时间】:2020-02-15 13:52:39
【问题描述】:
我尝试在我的 c 编程中复制 C++ 析构函数和构造函数。这意味着对于每个对象或结构,都有一个初始化函数和一个析构函数,它们可以像这样释放所有对象资源:
struct MyObject {
struct string a;
struct string b;
struct string c;
};
ConstructMyObject(struct MyObject *obj) {
ConstructString(&obj->a);
ConstructString(&obj->b);
ConstructString(&obj->c);
}
DestructMyObject(struct MyObject *obj) {
DestructString(&obj->a);
DestructString(&obj->b);
DestructString(&obj->c);
}
destruct 函数在每个函数作用域的末尾被调用,就像在 c++ 中一样,只是我手动将它放在那里。因此,现在在 DestructMyObject 函数中,我调用每个 struct string 类型的析构函数,因为对于 struct string 对象,我还将编写一个类似于 struct MyObject 对象的析构函数。
我的问题示例:
int main {
struct MyObject Object1;
ConstructMyObject(&Object1);
...
...
...
TransferOwnershipFunction(Object1.b); /*takes a struct string object as argument*/
...
...
...
DestructMyObject(&Object1);
return 0;
}
您看到我已将Object1 的一个成员的所有权转移到另一个函数,但Object1 的所有内容都将被main 函数中的析构函数销毁。
c++ 析构函数如何处理这种情况?我不希望struct string b 的析构函数在main 的末尾被调用,但它会被调用,因为我调用了MyObject 的析构函数。函数TransferOwnershipFunction(...) 现在负责释放字符串对象。
编辑
有人知道 rust 编译器如何解决这个问题吗?所以在 Rust 中,我是否需要 clone 我传递给 TransferOwnershipFunction 的结构字符串对象,或者是否有另一种方法,因为 clone (或 copying 我猜)似乎是一项非常昂贵的操作。
【问题讨论】:
-
在 C++ 中有一个移动构造函数和复制构造函数。不管你做什么,如果你移动一个对象,原始对象就会知道它被移动并转移了数据的所有权。无论如何都会调用原始对象的析构函数,那里没有什么可以释放的。你应该做类似
string_move(struct string *to, struct string *from) { to->data = from->data; from->data = NULL; } -
您的示例很难遵循,但这似乎与 C++ 程序员拒绝遵守 rule of 3 时没有什么不同。因此,C++不处理这个——程序员处理它。
-
请提供struct string的代码
-
struct string 将保存一个指向某个堆内存的指针,并在其析构函数中释放该指针。
标签: c++ c destructor ownership