blob: 25dc288d1a7abcfc8a86f6d166ae5ebed9b48194 [file] [view]
# The `Delete` trait
## Quick fix
If you've encountered this error when using Crubit's `virtual_unique_ptr<T>`,
note that `virtual_unique_ptr<T>` is only available when `T` is a C++ type with
a virtual destructor or which overrides operator delete.
When `T` does not have a virtual destructor and does not override operator
delete, use `cpp_std::unique_ptr<T>` instead.
## Why
For types with virtual destructors or custom operator delete implementations,
C++'s `delete ptr;` operation does more than simply destruct the value and
free the memory associated with the target type. Instead, C++ will use the
custom `operator delete` defined by the target type.
This makes it possible to convert a `std::unique_ptr<DerivedClass>` into a
`std::unique_ptr<BaseClass>` so long as `BaseClass` has a virtual destructor.
When the `std::unique_ptr<BaseClass>` is dropped, the `operator delete` on the
`BaseClass` will invoke the virtual destructor, resulting in a call to
the destructor of `DerivedClass`. After that, C++ knows to free memory the
size of `DerivedClass` rather than memory the size of `BaseClass`.
In order to replicate this behavior in Rust, C++'s `unique_ptr<T>` has been
split into two types: `unique_ptr` and `virtual_unique_ptr`. `unique_ptr`
assumes that the target type is concrete, while `virtual_unique_ptr` supports
C++ types with a virtual destructor or custom `operator delete`. Such types
will automatically receive a Crubit-generated implementation of the `Delete`
trait.