std::get_temporary_buffer因c++17起被弃用、不保证分配成功、不初始化内存、需手动配对释放且易导致泄漏而几乎无人使用;推荐改用std::vector或std::unique_ptr。

std::get_temporary_buffer 为什么几乎没人用
它不保证分配成功,也不保证初始化内存,返回的只是裸指针和实际获得的元素数量,且 C++17 起已标记为 deprecated。标准库自己都弃用了,说明它既难用又容易出错——比如你调用 std::get_temporary_buffer<int>(1000)</int>,可能只拿到 512 个 int,甚至 0 个,还必须手动调用 std::return_temporary_buffer 配对释放,漏掉就会泄漏。
替代方案:直接用 std::vector 或 std::unique_ptr
绝大多数场景下,std::vector 是更安全、更直观的选择:
auto buf = std::vector<int>(1000); // 自动构造、自动析构、内存连续 // 使用 buf.data() 获取原始指针(如需传给 C 接口) </int>
若明确不需要初始化(追求零开销),可用 std::unique_ptr + new T[n]:
auto ptr = std::unique_ptr<int>(new int[1000]); // 不初始化
// 或带初始化:std::unique_ptr<int>(new int[1000]{}); // 值初始化
</int></int>
两者都自动管理生命周期,无需手动配对释放,也避免了 std::get_temporary_buffer 的“申请数量不保真”问题。
如果非要用(比如维护旧代码),必须检查返回值
它的返回类型是 std::pair<t std::ptrdiff_t></t>,第二个值才是实际分配的元素数,**永远不能假设等于请求值**:
- 请求 100000 个
short,可能只得到 65536 个,也可能 0 个(系统拒绝) - 返回的
T*指向未初始化内存,不能直接当std::vector用 - 必须用
std::return_temporary_buffer(ptr)归还,且只能归还它自己分配的指针 - 不能混用
delete[]或free,否则 UB
示例:
auto res = std::get_temporary_buffer<int>(1000);
if (res.second == 0) {
// 分配失败,走备用路径(如抛异常或用栈数组)
}
int* p = res.first;
// 注意:p 指向的 res.second 个 int 未初始化,需手动构造(如用 placement new)
std::return_temporary_buffer(p); // 必须原指针,不能加偏移
</int>
C++17 之后别再新写它
标准明确弃用,编译器会警告,而且它底层行为依赖实现(有的返回 malloc 内存,有的复用线程局部池),不可移植。真正需要“临时缓冲区”的高性能场景(如 sort 的内部缓存),应优先考虑 std::pmr::vector(C++17)或自定义内存池,而不是这个半成品接口。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











