C++における安全なメモリ解放
手動でのメモリ解放
C++では new
で確保したメモリは delete
または delete[]
で解放する必要があります。
int* ptr = new int(10);
delete ptr; // メモリ解放
ptr = nullptr; // ダングリングポインタを防ぐ
配列を解放する場合は delete[]
を使用します。
int* arr = new int[5];
delete[] arr;
arr = nullptr; // 安全対策
スマートポインタを使った安全なメモリ管理
C++11以降では std::unique_ptr
や std::shared_ptr
を使うことで、安全なメモリ管理が可能です。
unique_ptr
#include <memory>
std::unique_ptr ptr = std::make_unique(10);
// deleteは不要
shared_ptr
#include <memory>
std::shared_ptr sptr1 = std::make_shared(20);
std::shared_ptr sptr2 = sptr1; // 参照カウントが増える
よくあるミスと対策
deleteの重複呼び出し
int* ptr = new int(10);
delete ptr;
delete ptr; // 未定義動作
対策:delete
後に ptr = nullptr;
を設定
deleteとdelete[]の混同
int* arr = new int[5];
delete arr; // 未定義動作
対策:配列は delete[]
を使用