見出し画像

C++でunique_ptrの簡単な使い方

1. はじめに

 スマートポインタは、動的に確保されたメモリを自動解放する仕組みのことである。過去の記述方法では、new/deleteを使用して、メモリの動的確保を実現していたが、deleteを書き忘れるとメモリリークとなる可能性があった。

 メモリ管理をプログラマが管理する利点もあるが、すべてを追うことが困難であり、メモリリークによって品質低下につながるケースも少なくない。そこで、スマートポインタを導入することで、メモリリーク防止が期待できる。

 今回は、簡単なプログラムでunique_ptrの使い方をまとめる。

2. new/deleteを使用したメモリの動的確保

 スマートポインタの導入以前のプログラムは、new/deleteを使用してメモリを動的に確保していた。

#include <iostream>
class Car {
private:
    std::string name;
public:
    void setName(std::string _name) {
        name = _name;
    }
    void display() {
        std::cout << name << std::endl;
    }
};

int main()
{
    Car *car = new Car(); // 生のポインタを使用して動的にCarオブジェクトを生成
    car->setName("車");
    car->display();
    delete car; // 使用後にオブジェクトを削除してメモリを解放
    return 0;
}

解説

  • new/deleteを使用してCarクラスの名前の設定と名前を表示するプログラムである。

  • 「Car *car = new Car();」で、動的にCarクラスのオブジェクトを生成する。

  • 「delete car」で、carクラスを削除してメモリを開放している。

 new/deleteを使用しても、メモリの動的確保は行えるが、deleteを書き忘れると、メモリリークとなる。

3. スマートポインタを使用したメモリの動的確保

 スマートポインタを使用すると、下記のように記述できる。

#include <iostream>
class Car {
private:
    std::string name;
public:
    void setName(std::string _name) {
        name = _name;
    }
    void display() {
        std::cout << name << std::endl;
    }
};
int main()
{
    std::unique_ptr<Car> car = std::make_unique<Car>();
    car->setName("パジェロ");
    car->display();

    // unique_ptrのデストラクタが自動的にCarオブジェクトを削除し、メモリを解放する。
    return 0;
}

解説

  • unique_ptr<クラス名> 変数名 = std::make_unique<クラス名>();と記述することで、スマートポインタを使用することができる(実際にはunique_ptr)。

  • deleteを記述してメモリ解放をする必要がない。

4. 終わりに

 今回は、簡単なスマートポインタの使用方法をまとめた。スマートポインタを使用することで、メモリ解放が自動的に行われるため、便利である。なにか特殊な動作をさせてたくないのであれば、スマートポインタを使用する方が良いだろう。



いいなと思ったら応援しよう!