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 << "returning temporary buffer...\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 ... returning temporary buffer...
欠陥報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2072 | C++98 |
std::get_temporary_buffer
によって割り当てられたストレージが複数回解放される可能性があった |
この場合の動作は
未定義である |
関連項目
|
(C++17で非推奨)
(C++20で削除)
|
未初期化ストレージを取得する
(関数テンプレート) |