C++ 析构函数和所有权

标签 c++ c destructor ownership

我尝试在我的 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 object 我也会有一个像 struct MyObject 一样的 destruct 函数对象。

我的问题示例:

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 中,我需要克隆我传递给 TransferOwnershipFunction 的结构字符串对象吗?或者是否有另一种方法,因为克隆(或复制 我猜)似乎是一项非常昂贵的操作。

最佳答案

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

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

关于C++ 析构函数和所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58453010/

相关文章:

c - 该代码如何工作(以英文显示数字)?一步步

c++ - 抽象基类中的析构函数保护在C++中不被继承?

c++ - 如何在 Thrift 中使用 C++ 获取客户端 IP 地址

c++ - VBO : Array not drawn

arrays - 在C中交换2个数组

C#:在终结器中,如何确定应用程序是否正在关闭?

c++ - 从数组中删除对象

c++ - 过度使用重新定义原始数据类型?

C++ 返回指针/引用

c - 使用 libdl API 调用打开共享库的区别