C++析构函数和所有权
C++ Destructors and 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
对象,我也会有一个像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
的副本一起使用。在这种情况下:
- 您需要创建用作复制构造函数和赋值运算符的模拟函数(对于 C++03(。在 C++11 中还添加了移动构造函数和移动赋值运算符。
- 在 C++03 中,如果不声明复制构造函数和赋值运算符,则会隐式生成它们。默认情况下,它们使用每个成员的复制构造函数按类成员(而不是按内存中的字节(复制对象(除了简单类型,如 int、double...(。所以你需要模仿通过调用复制构造函数来传递
Object1.b
值:TransferOwnershipFunction
创建类型为struct string
的新对象,按成员复制它的内容。如果struct string
包含一个原始指针作为成员,并且您在struct string
的构造函数中为此成员调用malloc
,并在析构函数中调用free
而不是在struct string
的复制构造函数中调用,则需要调用malloc
而不是从传递的变量中复制所有内容。不要忘记在TransferOwnershipFunction
末尾调用析构函数。 - 根据 RAII,您需要以与创建对象的顺序(构造函数的顺序(相反的顺序调用析构函数。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- C++析构函数和所有权