能否使用std::allocator在指定地址分配特定大小的内存
C++ std::allocator指定内存地址分配问题解答
结论
标准库提供的默认std::allocator不支持在用户指定的内存地址上完成内存分配操作。
具体说明
std::allocator的核心能力是向系统申请全新的堆内存块,其allocate(size_t n)成员函数仅接受要分配的元素数量作为入参,内部由标准库实现控制内存申请逻辑,返回的是新申请内存的首地址,全程不支持传入自定义的目标地址。- 如果你需要在预先确定的内存地址上构造对象,应当使用*定位new(placement new)*表达式,这是C++标准定义的合法实现方式,不需要通过分配器实现。
- 如果你有从自定义内存池、固定地址段分配内存的需求,可以自行实现符合C++标准Allocator规范的自定义分配器类,在其
allocate接口中实现返回指定地址内存块的逻辑,自定义分配器可以直接传入std::vector、std::map等标准库容器使用。
代码示例:定位new的基本用法
#include <iostream> #include <string> int main() { // 预先准备的内存缓冲区,首地址就是用户指定的目标地址,alignas保证对齐要求 alignas(std::string) char buffer[sizeof(std::string)]; // 在指定的buffer地址上构造std::string对象 std::string* str = new (buffer) std::string("test placement new"); std::cout << *str << std::endl; // 使用完成后手动调用析构函数销毁对象,不要调用delete,该内存不属于堆分配 str->~basic_string<char>(); return 0; }
注意:使用指定地址构造或分配内存时,必须保证目标地址满足对应类型的对齐要求,且可用空间足够,否则会触发未定义行为。
内容的提问来源于stack exchange,提问作者Hazem Abaza
相关产品推荐
相关产品推荐

