【C++学習|初心者向け】C++17から便利になった!shared_ptrで配列を扱うスマートな方法

1. 導入:なぜこの機能が重要なのか

C++でメモリ管理を安全に行うために欠かせない「スマートポインタ」。特にstd::shared_ptrは、複数の場所でオブジェクトを共有できるため非常に便利です。しかし、これまでは配列を管理する際に、添字演算子([ ])が使えず、少し不便に感じる場面がありました。
C++17からは、std::shared_ptrでも配列への直接アクセスが可能になりました。これにより、コードが簡潔になり、可読性が大幅に向上します。

2. 基礎知識:shared_ptrと配列

通常、std::shared_ptrは単一のオブジェクトを管理するために使われます。配列を管理する場合、これまではstd::vectorを使用するのが一般的でしたが、動的に確保された配列(new[])を管理したい場合、std::shared_ptrという形式で定義します。
今回のアップデートにより、この形式で宣言されたスマートポインタに対して、std::vectorのように[ ]を使って要素へ安全かつ直感的にアクセスできるようになりました。

3. 実装/解決策

std::shared_ptrで配列を扱う際は、テンプレート引数に配列型(T[])を指定します。これまでは、わざわざポインタのオフセット計算(ptr.get()[i]など)を行っていましたが、C++17以降は単に[ ]を記述するだけでよくなりました。

4. サンプルプログラム

以下のコードをコピー&ペーストして、C++17以降の環境でコンパイルして動作を確認してみてください。


include
include

int main() {
// 5つの整数を保持する配列をshared_ptrで管理
// 配列型を指定することで、自動的にdelete[]が呼ばれるようになります
std::shared_ptr arr(new int[5]{10, 20, 30, 40, 50});

// C++17から可能になった添字アクセス
// 配列の各要素に直接アクセスして値を書き換えます
arr[0] = 100;

// 内容を出力して確認
for (int i = 0; i < 5; ++i) { std::cout << "arr[" << i << "] = " << arr[i] << std::endl; } return 0; }

5. 応用・注意点

注意点1:境界チェックは行われない
std::shared_ptrの添字演算子は、std::vectorのat()メソッドのように、配列の範囲外へのアクセスをチェックしてエラーを出してくれるわけではありません。あくまで生の配列と同じ挙動であるため、範囲外アクセスによるバグには十分に注意してください。

注意点2:std::vectorとの使い分け
機能的には便利になりましたが、要素数の動的な変更が必要な場合は、依然としてstd::vectorを使用するのがベストプラクティスです。std::shared_ptrは、サイズが固定された大きな配列を複数の関数間で安全に共有したい場合などに限定して使うのが、現場での賢い使い分けといえるでしょう。

コメント

タイトルとURLをコピーしました