![見出し画像](https://assets.st-note.com/production/uploads/images/137271634/rectangle_large_type_2_7334f2343f534e6d97c7e439573c23c6.png?width=1200)
Photo by
azarashoshi
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. 終わりに
今回は、簡単なスマートポインタの使用方法をまとめた。スマートポインタを使用することで、メモリ解放が自動的に行われるため、便利である。なにか特殊な動作をさせてたくないのであれば、スマートポインタを使用する方が良いだろう。