導入: なぜ unique_ptr の配列対応が重要なのか
C++の現場において、生ポインタ(raw pointer)によるメモリ管理はバグの温床です。特に配列を動的に確保した場合、解放忘れ(メモリリーク)や、間違えて delete を呼び出すことによる未定義動作が頻発します。C++11以降、std::unique_ptr を活用することで、スコープを抜ける際に自動的に delete[] が呼ばれるようになり、安全性が劇的に向上しました。本記事では、この配列対応の正しい使い方と注意点を解説します。
基礎知識: スマートポインタと配列の特殊化
通常、std::unique_ptr
実装/解決策: std::make_unique の活用
C++14 から導入された std::make_unique を使用するのがベストプラクティスです。これにより、new[] 式を直接記述する必要がなくなり、例外安全かつコードの可読性が向上します。
サンプルプログラム
#include
include
int main() {
// 5要素のint配列を動的確保
// std::make_unique
const size_t size = 5;
std::unique_ptr
// 配列へのアクセスは通常のポインタと同様に行えます
for (size_t i = 0; i < size; ++i) {
arr[i] = static_cast
}
// 内容の確認
for (size_t i = 0; i < size; ++i) {
std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
}
// ここでスコープを抜ける際、自動的に delete[] が呼ばれます
// 手動での解放処理は一切不要です
return 0;
}
応用・注意点: 現場で役立つ補足情報
1. std::vector との使い分け
実務では、サイズが動的に変化する配列であれば、迷わず std::vector
2. 配列の添字アクセスに注意
std::unique_ptr
3. 誤ったテンプレート引数の指定
std::unique_ptr

コメント