C++析构函数和所有权

C++ Destructors and Ownership

本文关键字:所有权 析构函数 C++      更新时间:2023-10-16

我尝试在我的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++ 析构函数如何处理这种情况?我不希望在main结束时调用struct string b的析构函数,但它会被调用,因为我调用了MyObject的析构函数。函数TransferOwnershipFunction(...)现在负责释放字符串对象。

编辑有人知道 rust 编译器将如何解决这个问题?所以在 Rust 中我需要克隆我要传递给TransferOwnershipFunction的结构字符串对象,或者有没有另一种方法可以做到这一点,因为克隆(或复制i guees(似乎是一个非常昂贵的操作。

在我看来,main(( 应该负责创建和删除 Object1。并且 TransferOwnershipFunction(( 应该与Object1.b的副本一起使用。在这种情况下:

  1. 您需要创建用作复制构造函数赋值运算符的模拟函数(对于 C++03(。在 C++11 中还添加了移动构造函数移动赋值运算符
  2. 在 C++03 中,如果不声明复制构造函数赋值运算符,则会隐式生成它们。默认情况下,它们使用每个成员的复制构造函数按类成员(而不是按内存中的字节(复制对象(除了简单类型,如 int、double...(。所以你需要模仿通过调用复制构造函数来传递Object1.b值:TransferOwnershipFunction创建类型为struct string的新对象,按成员复制它的内容。如果struct string包含一个原始指针作为成员,并且您在struct string的构造函数中为此成员调用malloc,并在析构函数中调用free而不是在struct string的复制构造函数中调用,则需要调用malloc而不是从传递的变量中复制所有内容。不要忘记在TransferOwnershipFunction末尾调用析构函数。
  3. 根据 RAII,您需要以与创建对象的顺序(构造函数的顺序(相反的顺序调用析构函数。