[解決済み] なぜC++の「ベクター」で新規呼び出しをするのか?
質問
コード
vector<someType> myVector;
は動的にメモリを確保するため、保存された要素は
delete
が呼び出されます。では、次のような場合はどうでしょう。
vector<someType> *myVector = new vector<someType>();
は、先ほどのものと(ポインタであること以外)違うのでしょうか?
ここで二重のアロケーションが起こっているのでしょうか?
誰もが
vector
と
new
の呼び出しがありますが、なぜでしょうか?もし邪道なら、なぜコンパイラにとって許容できるコードで、いつ使ってもいいのでしょうか?
どのように解決するのか?
最初の記述は正しくありません。の要素は
vector<someType> myVector
は、ベクターが破壊されるまで生き続けます。もし
vector<someType>
がローカル変数である場合、スコープ外に出たときに自動的に破棄されます。明示的にdeleteを呼び出す必要はない。呼び出し方
delete
例外がスローされる可能性があることを考慮すると、明示的に行うことはエラーの原因になります。
delete
文にたどり着けず、メモリリークにつながる可能性があります。
例えば、次の2つのケースを比べてみてください。
void foo()
{
std::vector<int> v;
v.push_back(1);
f(); // f is some operation that might throw exception.
} // v is automatically destroyed even if f throws.
void bar()
{
std::vector<int>* v = new std::vector<int>;
v->push_back(1);
f(); // f is some operation that might throw exception.
delete v; // You need to call delete explicitly here.
// The vector will be destroyed only if f doesn't throw.
}
上記とは別に、ベクターが新しい要素を格納するために動的にメモリを確保することは事実です。この2つの場合の違いは
-
std::vector<int> v
vはスタック上のオブジェクトで、要素を格納するために動的にメモリを確保する。 -
std::vector<int>* v = new std::vector<int>
v は動的に割り当てられたオブジェクトへのポインターで、要素を格納するために動的にメモリが割り当てられます。すでに述べたように、このオブジェクトを破棄するには明示的にdeleteを呼び出す必要があります。
関連
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] JavaScriptの「new」キーワードとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】'cout'は型名ではない
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】システムが指定されたファイルを見つけられませんでした。