std:: get_temporary_buffer
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ヘッダーで定義
<memory>
|
||
|
template
<
class
T
>
std::
pair
<
T
*
,
std::
ptrdiff_t
>
|
(C++11まで) | |
|
template
<
class
T
>
std::
pair
<
T
*
,
std::
ptrdiff_t
>
|
(C++11から)
(C++17で非推奨) (C++20で削除) |
|
count が負またはゼロの場合、何も行いません。
それ以外の場合、
count
個の連続した
T
型オブジェクトの初期化されていない連続ストレージを割り当てる要求を行います。この要求は非拘束的であり、実装は代わりに任意の数(ゼロを含む)の連続した
T
型オブジェクトのストレージを割り当てる可能性があります。
|
オーバーアラインされた型がサポートされるかどうかは実装定義です。 |
(C++11以降) |
目次 |
パラメータ
| count | - | 要求されるオブジェクトの数 |
戻り値
A
std::pair
、メンバー
first
は割り当てられたストレージの先頭へのポインタであり、メンバー
second
は実際に割り当てられたストレージに収まるオブジェクトの数です。
count
<=
0
の場合、または割り当てられたストレージが型
T
の単一要素を格納するのに十分でない場合、結果のメンバー
first
はヌルポインタとなり、メンバー
second
はゼロとなります。
注記
このAPIは元々、汎用の operator new よりも効率的な実装を提供する意図で設計されましたが、そのような実装は作成されず、APIは非推奨となり削除されました。
例
#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 425 | C++98 | count <= 0 の場合の動作が不明確だった | 明確化された |
| LWG 2072 | C++98 | 不十分なメモリの割り当てが許可されていなかった | 許可されるようになった |
関連項目
|
(C++17で非推奨)
(C++20で削除)
|
初期化されていないストレージを解放する
(関数テンプレート) |
|
[static]
(C++23)
|
アロケータを介して要求されたサイズ以上のストレージを割り当てる
(
std::allocator_traits<Alloc>
のpublic staticメンバ関数)
|