diff options
| author | Oli Scherer <github35764891676564198441@oli-obk.de> | 2024-02-14 11:53:38 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-14 11:53:38 +0100 |
| commit | 407de0ee3354d0cfcdb903f9715f942750e4cb41 (patch) | |
| tree | 7b55a6d6fe34b76f407b6d48e2c2ebdc8f63ec4e | |
| parent | 1c7a9996f08c825444ef8beb3c3146acd3cea85b (diff) | |
| parent | 8e9c8dd10ad90a021381c39e8bf68a1748c2f56f (diff) | |
| download | rust-407de0ee3354d0cfcdb903f9715f942750e4cb41.tar.gz rust-407de0ee3354d0cfcdb903f9715f942750e4cb41.zip | |
Rollup merge of #118890 - Amanieu:allocator-lifetime, r=Mark-Simulacrum
Clarify the lifetimes of allocations returned by the `Allocator` trait
The previous definition (accidentally) disallowed the implementation of stack-based allocators whose memory would become invalid once the lifetime of the allocator type ended.
This also ensures the validity of the following blanket implementation:
```rust
impl<A: Allocator> Allocator for &'_ A {}
```
| -rw-r--r-- | library/core/src/alloc/mod.rs | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/library/core/src/alloc/mod.rs b/library/core/src/alloc/mod.rs index 78091c01729..1c8e6676544 100644 --- a/library/core/src/alloc/mod.rs +++ b/library/core/src/alloc/mod.rs @@ -95,8 +95,10 @@ impl fmt::Display for AllocError { /// # Safety /// /// * Memory blocks returned from an allocator that are [*currently allocated*] must point to -/// valid memory and retain their validity while they are [*currently allocated*] and at -/// least one of the instance and all of its clones has not been dropped. +/// valid memory and retain their validity while they are [*currently allocated*] and the shorter +/// of: +/// - the borrow-checker lifetime of the allocator type itself. +/// - as long as at least one of the instance and all of its clones has not been dropped. /// /// * copying, cloning, or moving the allocator must not invalidate memory blocks returned from this /// allocator. A copied or cloned allocator must behave like the same allocator, and @@ -114,6 +116,10 @@ pub unsafe trait Allocator { /// The returned block may have a larger size than specified by `layout.size()`, and may or may /// not have its contents initialized. /// + /// The returned block of memory remains valid as long as it is [*currently allocated*] and the shorter of: + /// - the borrow-checker lifetime of the allocator type itself. + /// - as long as at the allocator and all its clones has not been dropped. + /// /// # Errors /// /// Returning `Err` indicates that either memory is exhausted or `layout` does not meet |
