MST

星途 面试题库

面试题:C++中std::shared_ptr自定义分配器基础

请简述如何为`std::shared_ptr`创建一个简单的自定义分配器,假设分配的是`int`类型对象。需要给出关键代码片段,并解释自定义分配器类中至少两个主要成员函数的作用。
47.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 关键代码片段
#include <memory>
#include <iostream>

class CustomAllocator {
public:
    using value_type = int;

    CustomAllocator() = default;
    template <typename U>
    CustomAllocator(const CustomAllocator<U>&) noexcept {}

    int* allocate(std::size_t n) {
        std::cout << "Custom allocate " << n << " ints\n";
        return static_cast<int*>(::operator new(n * sizeof(int)));
    }

    void deallocate(int* p, std::size_t n) {
        std::cout << "Custom deallocate " << n << " ints\n";
        ::operator delete(p);
    }
};

template <typename T, typename U>
bool operator==(const CustomAllocator<T>&, const CustomAllocator<U>&) noexcept {
    return true;
}

template <typename T, typename U>
bool operator!=(const CustomAllocator<T>&, const CustomAllocator<U>&) noexcept {
    return false;
}
  1. 主要成员函数作用解释
    • allocate函数
      • 功能:负责实际的内存分配工作。它接受一个参数n,表示需要分配的int类型对象的数量。在这个函数中,通过::operator new来分配nint大小的内存空间,并返回一个指向分配内存起始地址的指针。同时,这里添加了输出语句用于展示自定义分配器正在进行分配操作。
    • deallocate函数
      • 功能:负责释放之前通过allocate函数分配的内存。它接受两个参数,一个是指向要释放内存起始地址的指针p,另一个是之前分配的对象数量n。在这个函数中,通过::operator delete来释放由p指向的内存空间。同样添加了输出语句用于展示自定义分配器正在进行释放操作。

使用示例:

int main() {
    std::shared_ptr<int, CustomAllocator> ptr(new int(42), CustomAllocator());
    return 0;
}

main函数中,创建了一个std::shared_ptr,使用自定义分配器CustomAllocator来分配和释放int对象。