web-dev-qa-db-ja.com

std :: vectorのデフォルトの構築がnewを呼び出さないことが保証されていますか?

参照 によると単純なstd::vector<T> vec;空のコンテナ(デフォルトのコンストラクタ)を作成します。これにより、動的なメモリ割り当てがないことが保証されますか?または、実装がメモリを予約することを選択できますか?

この空のコンストラクターの場合、C++ 11以降、タイプTの構文がないことを私は知っていました。ただし、ヒープに何も割り当てられないという保証もあるのではないかと思います。つまり上記の行は、スタック/メンバーのほんの数nullptrです。

私はそれをvc140でテストしましたが、実際には動的な割り当てはありません。

21

これにより、動的なメモリ割り当てがないことが保証されますか?

いいえ。ただし、実装がメモリを割り当てないのは非常に一般的です。私はそうする標準ライブラリの実装を見たことがありません。

または、実装がメモリを予約することを選択できますか?

かもしれませんが、それは異例です。

この空のコンストラクターの場合、C++ 11以降、タイプTの構文がないことを私は知っていました。

また、C++ 11より前。

26
eerorika

stdライブラリはC++言語の一部です。

Stdライブラリクラスまたは関数へのほとんどすべての呼び出しは、病理学的で非常識なことを行う可能性があります。しかし、同じことが_int x=7;_にも当てはまります。この標準は、stdライブラリを含む率直に敵対的なC++実装を防御するようには作成されていません。

そうは言っても、stdvectorへのゼロ引数コンストラクターも例外ではありません。これは、割り当てないのは意図されたであることを意味します。敵対的な実装は、割り当てが成功したかどうかに関係なく、自由に割り当て、エラーをキャッチし、続行できます。敵対的な実装も47兆まで自由に数え、ランダムデータでFFTを実行し、ニューラルネットワークを起動してシェイクスピアに対してトレーニングし、ソネットを作成して、何も起こらなかったかのように進めます。この標準は、C++での操作の観察できない詩の構成については何も述べていません。アクションに(抽象マシン内で)観察可能な副作用がない限り、標準には意見がありません。

実際には、std::vector<T>()を割り当てる理由はなく、それ以降の操作で割り当てられたと見なすことはできません。イテレータ無効化エラーを強制するためにライフタイムトラッキングトークンを割り当てるインストルメント化されたビルドを見ることができましたが、それは追加のフラグ(_-DCMP_JUN17_など)を使用したデバッグでのみ有効になります。

新しいものへの呼びかけよりも詩についてもっと心配する。