new/deleteによるヒープ割り当て
動的メモリを管理します
「new/deleteによるヒープ割り当て」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
new による動的メモリ
new 演算子はオブジェクトをヒープ(フリーストア)に割り当て、そのオブジェクトへのポインタを返します。ヒープ上のオブジェクトは、明示的に解放するまで存続します。
#include <iostream>
int main() {
int* p = new int(42); // heap allocation
std::cout << *p << "\n";
delete p; // release it
}delete による解放
すべての new には、必ず1回だけ delete を対応させる必要があります。忘れるとメモリリークが発生し、2回実行するとヒープが破壊されます。
#include <iostream>
int main() {
double* d = new double(3.5);
std::cout << *d << "\n";
delete d; // exactly once
}配列:new[] と delete[]
配列には new[] と、それに対応する delete[] を使います。new[] と通常の delete を組み合わせると未定義動作になります。
#include <iostream>
int main() {
int* arr = new int[3]{1, 2, 3};
for (int i = 0; i < 3; ++i) std::cout << arr[i] << "\n";
delete[] arr; // note the [ ]
}ヒープを使う理由
オブジェクトを作成した関数よりも長く存続させる必要がある場合や、サイズが実行時までわからない場合はヒープを使います。それ以外ではスタックを優先してください。
ヒープのライフタイムは手動管理
スタックとは異なり、ヒープはオブジェクトを自動的に解放しません。メモリを解放するタイミングを正確に制御するのはあなたであり、その責任もあなたにあります。
#include <iostream>
int* makeCounter() {
return new int(0); // survives the function
}
int main() {
int* c = makeCounter();
std::cout << *c << "\n";
delete c;
}delete 後はポインタを nullptr に設定する
削除した後はポインタを nullptr に設定してください。解放済みメモリに触れる代わりに、誤った再利用をすぐに検出できるようになります。
#include <iostream>
int main() {
int* p = new int(9);
delete p;
p = nullptr; // now p is safe to check
if (!p) std::cout << "freed\n";
}割り当ては失敗することがある
システムのメモリが不足している場合、new は std::bad_alloc をスローします。非常に大きなメモリを割り当てるときには、実際に起こり得る問題です。
実行時サイズのバッファ
ヒープ上の配列では、実行時に計算したサイズを使えます。これは、スタック上の配列では移植性を保って実現できません。
#include <iostream>
int main() {
int n = 5;
int* buf = new int[n];
for (int i = 0; i < n; ++i) buf[i] = i * i;
std::cout << buf[4] << "\n";
delete[] buf;
}スマートポインタを優先する
現代のC++では、生の new/delete は避けます。std::unique_ptr と std::make_unique を使うと、ポインタがスコープを抜けたときにメモリが自動的に解放されます。
#include <iostream>
#include <memory>
int main() {
auto p = std::make_unique<int>(42);
std::cout << *p << "\n";
} // freed automaticallyヒープのコスト
ヒープへのメモリ割り当てはスタックよりも遅くなります。空きブロックを探し、管理情報を更新する必要があるためです。小さなメモリを頻繁に割り当てると、パフォーマンスが低下することがあります。
すべての new に対応させる
基本原則は、すべての new に1つの delete を、すべての new[] に1つの delete[] を対応させることです。さらによい方法は、スマートポインタに任せることです。
理解度チェック
ヒープ割り当てについての理解度を確認しましょう。
まとめ
new/new[] を使ってヒープにメモリを割り当て、delete/delete[] で解放する方法を学びました。ヒープ上のオブジェクトはスコープを越えて存続できますが、手動での後片付けが必要です。すべての割り当てに対応する解放を行い、解放済みのポインタは無効化し、現代的なコードでは std::unique_ptr を優先してください。
よくある質問
「new/deleteによるヒープ割り当て」レッスンは無料ですか?
はい。「new/deleteによるヒープ割り当て」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「new/deleteによるヒープ割り当て」で何を学びますか?
動的メモリを管理します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「new/deleteによるヒープ割り当て」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- スタック割り当て
- new/deleteによるヒープ割り当て
- オブジェクトのライフタイム
- よくあるメモリバグ