[解決済み] 動的に割り当てられた2次元配列の削除 [重複]について
2022-03-02 18:28:39
質問
だから、私はC言語のメモリ管理には慣れていて、そこで
free(pointer)
が指すすべての領域を解放します。
pointer
. 今、私はC++で簡単なことをやろうとして、自分自身を混乱させている。
2次元のdouble配列がこのような方法で割り当てられているとします。
double** atoms = new double*[1000];
for(int i = 0; i < 1000; i++)
atoms[i] = new double[4];
new で確保されたヒープ上のメモリを解放する正しい方法は何でしょうか?
私の考えは元々こうでした(脳がC言語で考えていたので)。
for(int i = 0; i < 1000; i++)
delete atoms[i];
delete atoms;
しかし、私はその存在を忘れていました。
delete[]
演算子を使うので、正しい方法は次のようになると思います。
for(int i = 0; i < 1000; i++)
delete[] atoms[i];
delete[] atoms;
の違いを理解することが重要なのでしょうか?
delete
と
delete[]
演算子を使用することができますか?それとも、配列の確保に
ptr = new x[]
を使用する必要があります。
delete[] ptr
?
解決方法は?
現実には、ポインタが指す配列は、やはりメモリアドレスを保持するための整数型データ型や数値の配列です。を使用する必要があります。
delete[]
のどちらにも対応します。
また、そうです。
new[]
を意味します。
delete[]
.
配列の配列を作成するとき、実際には
数値の配列
のメモリアドレスを保持し、それがたまたま
数値の配列
. とはいえ、どちらも数字の配列ですから、両方とも
delete[]
.
http://coliru.stacked-crooked.com/a/8a625b672b66f6ce
#include <iostream>
int main() {
//Hey, pointers have a finite size, no matter the indirection level!
std::cout << "sizeof(int*): " << sizeof(int*) << std::endl;
std::cout << "sizeof(int**): " << sizeof(int**) << std::endl;
std::cout << "sizeof(int***): " << sizeof(int***) << std::endl;
//Create an array of pointers that points to more arrays
int** matrix = new int*[5];
for (int i = 0; i < 5; ++i) {
matrix[i] = new int[5];
for (int j = 0; j < 5; ++j) {
matrix[i][j] = i*5 + j;
}
}
//Print out the matrix to verify we have created the matrix
for (int j = 0; j < 5; ++j) {
for (int i = 0; i < 5; ++i) {
std::cout << matrix[j][i] << std::endl;
}
}
//Free each sub-array
for(int i = 0; i < 5; ++i) {
delete[] matrix[i];
}
//Free the array of pointers
delete[] matrix;
return 0;
}
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む