Skip to content

LinkedList::remove forgets the allocator #125950

@xTachyon

Description

@xTachyon

I tried this code:

#![feature(allocator_api)]
#![feature(linked_list_remove)]

use std::{
    alloc::{AllocError, Allocator, Layout},
    collections::LinkedList,
    process::abort,
    ptr::NonNull,
};

struct M;

unsafe impl Allocator for M {
    fn allocate(&self, layout: std::alloc::Layout) -> Result<NonNull<[u8]>, AllocError> {
        unsafe {
            if layout.align() > std::mem::align_of::<usize>() {
                abort();
            }
            let ptr = libc::malloc(layout.size()) as *mut u8;
            if ptr.is_null() {
                abort();
            }
            println!("alloc: {:?}", ptr);
            let nonnull = NonNull::new_unchecked(ptr);
            Ok(NonNull::slice_from_raw_parts(nonnull, layout.size()))
        }
    }

    unsafe fn deallocate(&self, ptr: NonNull<u8>, _layout: Layout) {
        unsafe {
            println!("dealloc: {:?}", ptr);
            libc::free(ptr.as_ptr() as _);
        }
    }
}

fn main() {
    let alloc = &M;
    let mut list = LinkedList::new_in(alloc);
    list.push_back(5);
    list.remove(0);
}

I expected to see this happen: alloc and dealloc is printed

Instead, this happened: only alloc is printed

Meta

rustc --version --verbose:

rustc 1.80.0-nightly (f67a1acc0 2024-06-01)
binary: rustc
commit-hash: f67a1acc04c7ecbf05751b17592dd8d245b75256
commit-date: 2024-06-01
host: x86_64-unknown-linux-gnu
release: 1.80.0-nightly
LLVM version: 18.1.6

LinkedList::remove forgets that it's been initialized with an allocator, and always deletes the node with the global allocator.

let unlinked_node = Box::from_raw(unlinked_node.as_ptr());

There seems to be one more place where this happens in the same file.

Metadata

Metadata

Assignees

Labels

A-allocatorsArea: Custom and system allocatorsA-collectionsArea: `std::collections`C-bugCategory: This is a bug.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    pFad - Phonifier reborn

    Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

    Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


    Alternative Proxies:

    Alternative Proxy

    pFad Proxy

    pFad v3 Proxy

    pFad v4 Proxy