C++ std::vector要素のメモリ割り当て問題
2022-02-22 14:50:20
質問を見るには
C++のSTL vectorを使用する場合、以下の3つの書き方の違いは何ですか?また、それらのメモリ割り当てはどのようになりますか?
std::vector
vec;
std::vector
* Vec = new std::vector
();
std::vector
First, the conclusion (assuming T is a well-defined class).
For
std::vector<T> vec;
vec is on the stack (stack), and the elements of it, T, are kept on the heap (heap).
For
std::vector<T>* Vec = new std::vector<T>();
vec and the elements of it, T, are stored on the heap.
For
std::vector<T*> vec;
vec is on the stack (stack), and the elements of it, T, are kept on the heap (heap); similar to the first case.
Here's an experiment on the difference between the first case and the second case!
The following code declares a class A and a function IsObjectOnStack() to monitor whether the object is on the stack, which uses the Windows system API.
#include
#include
#include
Here is the test for the first case.
int main()
{
vector
aa;
int nCount = 2;
for (int i = 0; i < nCount; i++)
{
A a;
BOOL isOnStack = IsObjectOnStack(&a);
if (isOnStack) cout << "Object a is created on the stack... " << '\n';
else cout << "Object a is created on the heap... " << '\n';
aa.push_back(a);
}
BOOL isOnStack = IsObjectOnStack(&(aa.at(0)));
if (isOnStack) cout << "Element in std::vector created on stack... " << '\n';
else cout << "Element in std::vector created on heap... " << '\n';
return 0;
}
Run the result.
As you can see
std::vector<A>
element A is created on the stack. And the object on the stack is copied to the heap by copy on push_back.
Third case test.
int main()
{
vector
Run the result.
This one is obvious
std::vector<A*>
The objects in it are on the heap. After use, we must manually free the memory occupied by that object.
So, personally, I think the main difference between the two is that
std::vector<T>
and
std::vector<T*>
in which the element T is stored on the stack, and
std::vector<T>
There is no need to manually manage memory space, while
std::vector<T*>
need to manually delete to release the space on the stack. But when push_back
std::vector<T>
will be more efficient than
std::vector<T*>
with one more copy construction.
std::vector<T> vec;
関連
-
C++11での移動セマンティクス(std::move)と完全な前進(std::forward)。
-
解決策:エラー:'cout'は型名ではありません。
-
c++ エラー: 'map' は型名ではありません。
-
error: 'vector' does not name a type
-
C++-コラムフィッティングフィットシリンダー
-
C++プリントベクター
-
C++ Error no matching function for call to 'std::basic_ofstream<char>::basic_ofstream(std::string&)
-
C++11 ランダムライブラリ乱数
-
C++によるhttpサーバー/webサーバーの作成
-
ベクトル添え字が範囲外のコンテナの使用、その他類似のエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Linux の 'pthread_create' への未定義参照問題を解決しました。
-
の 0x091f11c7 での未処理例外について。0xC0000005: アクセス違反の読み取り位置 0x0ab0f
-
エラー: 'xxx' は事前宣言と C++ ヘッダーファイルが互いに含まれているため、型名になりません。
-
c++11の機能を含むcmakeの書き方 (-std=c++11 cmakeList.txtに書き込む方法)
-
ソースファイルをコンパイルするとDev C++のランタイムエラーが発生し、コンパイルできない
-
error: '&' トークンの前にイニシャライザーがあるはずです。
-
C++プロジェクトのコンパイル時に再定義の多重定義問題を解決する
-
抽象クラス型 "my class "のオブジェクトは使用できません 解決方法
-
C++共通ライブラリ関数一覧
-
ベクター使用時、ベクター添え字が範囲外、その他類似のエラーが発生する。