【C++】new delete 使わないで動的メモリ確保を行う方法

目次から探す

スマートポインタが扱いやすい

スマートポインタとは

スマートポインタは、C++の標準ライブラリで提供されているクラスです。

これを使用することで、動的メモリの確保と解放を自動的に行うことができます。

スマートポインタは、通常のポインタと同じように振る舞いますが、メモリの解放を忘れるといったミスを防ぐことができます。

スマートポインタの種類

C++の標準ライブラリには、いくつかのスマートポインタの種類があります。

代表的なものとしては、unique_ptrshared_ptrweak_ptrがあります。

それぞれのスマートポインタは、異なるメモリ管理の方法を提供しています。

unique_ptr

unique_ptrは、所有権を一つのオブジェクトに限定するスマートポインタです。

つまり、一つのunique_ptrが特定のオブジェクトを所有している間は、他のunique_ptrやポインタからそのオブジェクトにアクセスすることはできません。

unique_ptrは、所有権が移動する場合に使用されることが多いです。

shared_ptr

shared_ptrは、複数のスマートポインタが同じオブジェクトを所有できるスマートポインタです。

shared_ptrは、参照カウントを使用してオブジェクトの所有権を管理します。

参照カウントがゼロになると、オブジェクトは自動的に解放されます。

shared_ptrは、複数の箇所で同じオブジェクトにアクセスする必要がある場合に使用されます。

weak_ptr

weak_ptrは、shared_ptrの所有権を持たず、オブジェクトへの参照を保持するスマートポインタです。

weak_ptrは、オブジェクトの参照を監視するために使用されますが、オブジェクトの所有権を持たないため、オブジェクトの解放には影響を与えません。

スマートポインタの利点

スマートポインタを使用することで、メモリの確保と解放を自動化することができます。

これにより、メモリリークやメモリの過剰確保といった問題を防ぐことができます。

また、スマートポインタは、所有権の管理を自動的に行ってくれるため、プログラマが手動でメモリの解放を行う必要がなくなります。

これにより、プログラムの保守性や安全性を向上させることができます。

スマートポインタの注意点

スマートポインタを使用する際には、いくつかの注意点があります。

まず、unique_ptrは所有権を一つのオブジェクトに限定するため、所有権を移動する場合には注意が必要です。

また、shared_ptrは参照カウントを使用しているため、循環参照が発生する可能性があります。

循環参照が発生すると、オブジェクトが解放されずにメモリリークが発生する可能性があります。

そのため、循環参照にならないように注意する必要があります。

スマートポインタのサンプルコード

以下に、unique_ptrshared_ptrの使用例を示します。

#include <iostream>
#include <memory>
int main() {
    // unique_ptrの使用例
    std::unique_ptr<int> uniquePtr(new int(10));
    std::cout << *uniquePtr << std::endl;
    // shared_ptrの使用例
    std::shared_ptr<int> sharedPtr1(new int(20));
    std::shared_ptr<int> sharedPtr2 = sharedPtr1;
    std::cout << *sharedPtr1 << std::endl;
    std::cout << *sharedPtr2 << std::endl;
    return 0;
}

上記のコードでは、unique_ptrshared_ptrを使用して、それぞれのポインタが所有する整数値を表示しています。

unique_ptrは所有権を一つのオブジェクトに限定するため、所有権が移動すると元のポインタは無効になります。

一方、shared_ptrは複数のポインタが同じオブジェクトを所有できるため、複数のポインタから同じ値を参照することができます。

スマートポインタはC++11以降で利用可能です。

1 2

この記事のページ一覧
  1. 現在のページ
目次から探す