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() { const std::string s[] = {"string", "1", "test", "..."}; const auto 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 中移除) |
获得未初始化存储 (函数模板) |