この章では、C++における「動的なメモリ確保と解放」について学びます。プログラムの実行中に必要なだけメモリを確保したり、不要になったら解放することで、柔軟なメモリ管理が可能になります。
| 種類 | 宣言例 | 確保のタイミング | 解放方法 |
|---|---|---|---|
| 静的確保 | int a; |
コンパイル時 | 自動 |
| 動的確保 | int* p = new int; |
実行時(プログラム中) | delete p; |
new で確保し、delete
で明示的に解放する必要がある#include <iostream>
using namespace std;
int main() {
int* p = new int; // int型のメモリを1つ確保
*p = 100; // 値を代入
cout << *p << endl; // 値を表示
delete p; // メモリを解放
return 0;
}#include <iostream>
using namespace std;
int main() {
int size;
cout << "配列のサイズを入力: ";
cin >> size;
int* arr = new int[size];
for (int i = 0; i < size; i++) arr[i] = i * 10;
for (int i = 0; i < size; i++) cout << arr[i] << " ";
cout << endl;
delete[] arr; // 配列は delete[] で解放
return 0;
}| 項目 | new / delete |
vector |
|---|---|---|
| サイズの可変性 | 自分で確保し直す必要あり | .push_back()で簡単に拡張可能 |
| 解放 | 明示的に delete 必要 |
自動で解放される |
| 安全性 | ミスするとメモリリーク | 安全で例外処理も対応 |
| 推奨度 | 低(必要なときのみ) | 高(基本的にこちらを使う) |
✅ 通常は vector を使えば十分。new
は特別な場合にだけ使う。
次のコードの出力は何ですか?
int* p = new int[3];
p[0] = 10; p[1] = 20; p[2] = 30;
cout << p[1];
delete[] p;#include <iostream>
using namespace std;
int main() {
int n;
cout << "人数を入力: ";
cin >> n;
int* scores = new int[n];
int total = 0;
for (int i = 0; i < n; i++) {
cout << i + 1 << "人目の点数: ";
cin >> scores[i];
total += scores[i];
}
cout << "合計: " << total << endl;
cout << "平均: " << (double)total / n << endl;
delete[] scores;
return 0;
}new は動的にメモリを確保し、delete
で解放するdelete[] を忘れずにvector を使う方が安全で簡単