std:: return_temporary_buffer
From cppreference.net
C++
Memory management library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定义于头文件
<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 中的每个字符串 // (注意提前退出点和异常) 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 ... returning temporary buffer...
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 应用于 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 2072 | C++98 |
由
std::get_temporary_buffer
分配的存储空间可能被多次释放 |
此情况下行为
是未定义的 |
参见
|
(C++17 中弃用)
(C++20 中移除)
|
获取未初始化的存储空间
(函数模板) |