面试题答案
一键面试- 关键代码片段:
#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;
}
- 主要成员函数作用解释:
- allocate函数:
- 功能:负责实际的内存分配工作。它接受一个参数
n
,表示需要分配的int
类型对象的数量。在这个函数中,通过::operator new
来分配n
个int
大小的内存空间,并返回一个指向分配内存起始地址的指针。同时,这里添加了输出语句用于展示自定义分配器正在进行分配操作。
- 功能:负责实际的内存分配工作。它接受一个参数
- deallocate函数:
- 功能:负责释放之前通过
allocate
函数分配的内存。它接受两个参数,一个是指向要释放内存起始地址的指针p
,另一个是之前分配的对象数量n
。在这个函数中,通过::operator delete
来释放由p
指向的内存空间。同样添加了输出语句用于展示自定义分配器正在进行释放操作。
- 功能:负责释放之前通过
- allocate函数:
使用示例:
int main() {
std::shared_ptr<int, CustomAllocator> ptr(new int(42), CustomAllocator());
return 0;
}
在main
函数中,创建了一个std::shared_ptr
,使用自定义分配器CustomAllocator
来分配和释放int
对象。