std::return_temporary_buffer
来自cppreference.com
在标头 <memory> 定义 | ||
template<class T > void return_temporary_buffer( T* p ); | (C++17 弃用) (C++20 移除) | |
解分配由 p 指代的存储。
如果 p 不是先前调用 std::get_temporary_buffer 返回的指针值,或者它指代的存储先前已被其他 std::return_temporary_buffer
调用解分配,那么行为未定义。
目录 |
[编辑]参数
p | - | 指代要解分配的存储的指针 |
[编辑]返回值
(无)
[编辑]异常
不抛出。
[编辑]示例
运行此代码
#include <algorithm>#include <iostream>#include <iterator>#include <memory>#include <string> int main(){conststd::string s[]={"string", "1", "test", "..."};constauto p =std::get_temporary_buffer<std::string>(4);// 要求将 p.first 传递给 return_temporary_buffer// (当心提前退出和异常),或者更应该使用:std::unique_ptr<std::string, void(*)(std::string*)> on_exit(p.first, [](std::string* p){std::cout<<"返还临时缓冲区...\n"; std::return_temporary_buffer(p);}); std::copy(s, s + p.second, std::raw_storage_iterator<std::string*, std::string>(p.first));// 效果等同于:std::uninitialized_copy(s, s + p.second, p.first);// 要求单独销毁每个 p 中的 string// (当心提前退出和异常) std::copy(p.first, p.first+ p.second, std::ostream_iterator<std::string>{std::cout, "\n"}); std::for_each(p.first, p.first+ p.second, [](std::string& e){ e.~basic_string<char>();});// 等同于:std::destroy(p.first, p.first + p.second); // 不使用 unique_ptr 这类技巧时要手动回收内存:// std::return_temporary_buffer(p.first);}
输出:
string 1 test ... 返还临时缓冲区...
[编辑]缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2072 | C++98 | 可以多次解分配由 std::get_temporary_buffer 分配的存储 | 此时行为未定义 |
[编辑]参阅
(C++17 弃用)(C++20 移除) | 获得未初始化存储 (函数模板) |