我尝试在我的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);
}
破坏函数在每个函数作用域的末尾都被调用,就像在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中,我需要clone我要传递给TransferOwnershipFunction
的结构字符串对象,还是有另一种方法可以这样做,因为cloning(或copying我猜是这样)是一个非常昂贵的手术。
从我的角度来看,main()应该负责创建和删除Object1。并且TransferOwnershipFunction()应该与Object1.b
的副本一起使用。在这种情况下:
Object1.b
:在TransferOwnershipFunction
中创建类型为struct string
的新对象,并按成员copy的内容进行创建。如果struct string
包含原始指针作为成员,并且您在malloc
的构造函数中为此成员调用struct string
,在析构函数中调用该free
,而不是struct string
的复制构造函数,则需要调用[C0 ],然后从传递的变量中复制所有内容。不要忘记在malloc
的末尾调用析构函数。TransferOwnershipFunction
,您需要以与创建对象的顺序(构造函数的顺序)相反的顺序调用析构函数。