[解決済み] C++ ポインターの配列:delete または delete []?
2022-02-11 22:11:37
質問
次のコードを考えてみてください。
class Foo
{
Monster* monsters[6];
Foo()
{
for (int i = 0; i < 6; i++)
{
monsters[i] = new Monster();
}
}
virtual ~Foo();
}
正しいデストラクタは何ですか?
これを
Foo::~Foo()
{
delete [] monsters;
}
またはこれです。
Foo::~Foo()
{
for (int i = 0; i < 6; i++)
{
delete monsters[i];
}
}
現在、一番上のコンストラクタで、すべて問題なく動作していますが、もちろん、たまたま漏れているのかどうかはわかりません...。
個人的には、私がやっていることを考えると、2番目のバージョンの方がずっと論理的だと思います。とにかく、これを行うための "適切な"方法は何でしょうか?
どのように解決するのですか?
delete[] monsters;
は正しくありません。
monsters
は、動的に確保された配列へのポインタではありません。
は
ポインタの配列です。クラスのメンバーとして、クラスのインスタンスが破棄されるときに自動的に破棄されます。
配列内のポインタは、動的に割り当てられた
Monster
オブジェクトを作成します。
現在のメモリ割り当て戦略では、おそらく独自のコピーコンストラクタとコピー代入演算子を宣言して、意図しないコピーによって二重削除が発生しないようにしたいことに注意してください。(もしコピーを防ぎたいのであれば、これらをプライベートとして宣言し、実際には実装しないことも可能です)。
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] オブジェクトが配列であるかどうかを確認するにはどうすればよいですか?[重複]。
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】JavaScriptで配列の要素を削除する - delete vs splice
最新
-
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 "は未定義?
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】C++の余分な資格エラー
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー