Rust的Drop和C ++的析构函数之间有什么区别?

时间:2018-11-15 16:50:32

标签: c++ rust

在阅读Drop特质的同时,我发现Rust的drop方法和C ++中的析构函数之间有很多相似之处。两者有什么区别?

2 个答案:

答案 0 :(得分:4)

在实践中,没有明显的区别。两者都用于在适当时清理类型的资源。

  

无论实现Drop特性如何,资源都会被清理,不是吗?

是的。编译器本质上会自动为程序员没有实现的任何类型实现Drop。这种自动实现只需依次为每个成员变量调用drop

如果您分配Rust不知道的资源,例如直接从分配器分配内存,Rust将不会知道需要删除返回值或如何删除返回值。那就是您直接实现Drop的时候。

另请参阅:

答案 1 :(得分:0)

我所知道的唯一区别与 C++ 具有但 Rust 没有的特性有关。其他人在上面的评论中提到了继承,但一个更简单的例子可能是具有多个构造函数的类型。在 Rust 中,根据我们所说的“构造函数”,我们可以说每个类型都只有一个构造函数(您命名类型并初始化其所有字段的语法)。但是在 C++ 中,一个类型可以有多个构造函数,重要的是,一个构造函数可以委托给另一个。这是一个简单的例子:

class foo {
public:
  // the inner constructor
  foo(bool throw_in_inner_ctor) {
    if (throw_in_inner_ctor) {
      throw runtime_error("throw in inner ctor");
    }
  }

  // the outer constructor, which delegates to the inner one
  foo(bool throw_in_inner_ctor, bool throw_in_outer_ctor)
      : foo(throw_in_inner_ctor) {
    if (throw_in_outer_ctor) {
      throw runtime_error("throw in outer ctor");
    }
  }

  // the destructor
  ~foo() {
    cout << "foo dtor\n";
  }
};

int main() {
  try {
    cout << "construct a foo that throws in its inner ctor\n";
    foo(true, false);
  } catch (runtime_error) {}
  try {
    cout << "construct a foo that throws in its outer ctor\n";
    foo(false, true);
  } catch (runtime_error) {}
}

打印:

construct a foo that throws in its inner ctor
construct a foo that throws in its outer ctor
foo dtor

我们在这里看到的是,当内部构造函数抛出时,foo 的析构函数不会被调用。但是当外部构造函数抛出时,它会抛出。规则是,如果 any 构造函数无异常返回,我们的 foo 将被破坏,而不管其他委托构造函数可能会做什么。 Rust 没有与此规则等效的规则,这既是因为 Rust 没有委托构造函数,也因为 Rust 中的构造函数(如果你想调用它们)不能运行任意代码并且不会失败。