C ++析构函数和所有权

问题描述 投票:2回答:1

我尝试在我的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我猜是这样)是一个非常昂贵的手术。

c++ c destructor ownership
1个回答
1
投票

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

  1. 您需要创建类似于复制构造函数赋值运算符(对于C ++ 03)的函数。在C ++ 11中还添加了move构造函数move赋值运算符
  2. 如果不声明,则会隐式生成
  3. 在C ++ 03中,复制构造函数赋值运算符。默认情况下,它们使用每个成员的复制构造函数按类的成员(而不是内存中的字节)复制对象(int,double等简单类型除外)。因此,您需要模仿通过调用[[copy constructor来按值传递Object1.b:在TransferOwnershipFunction中创建类型为struct string的新对象,并按成员copy的内容进行创建。如果struct string包含原始指针作为成员,并且您在malloc的构造函数中为此成员调用struct string,在析构函数中调用该free,而不是struct string复制构造函数,则需要调用[C0 ],然后从传递的变量中复制所有内容。不要忘记在malloc的末尾调用析构函数。
  4. 根据TransferOwnershipFunction,您需要以与创建对象的顺序(构造函数的顺序)相反的顺序调用析构函数。
© www.soinside.com 2019 - 2024. All rights reserved.