C++Builderでスマートポインタを使う
スマートポインタとは
端的に言えば、自動的にメモリ領域の解放を行ってくれるライブラリ。C++ではnew-deleteによるメモリ確保が一般的であるが、delete落ちによるメモリリークが問題となりメモリを自動的に解放する仕組みが要求されるようになった。
C++11においてstd::unique_ptr、std::shared_ptr、std::weak_ptr等が規定され、近年ではこれらがよく用いられるようになった。
C++Builderで使用するには
C++BuilderでもCLANGコンパイラなら問題なく使用できる。Classicコンパイラでもstd::unique_ptrが使用できる。Boostをインストールすればshared_ptrなども使用できるが、リンカの設定で動的RTLをONにすることを強制されるため、少々扱いづらい。
使い方
ここではstd::unique_ptrに絞って、その使用方法を記載する。
まず、TStrirngListメモリを確保するコードを記載する。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList *list = new TStringList();
// ... codeing ...
delete list;
}
これをスマートポインタで書き直すと以下になる。
#include "memory" // memoryのincludeが必要
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// スマートポインタの定義 ... スコープを抜けると自動でdeleteされる
std::unique_ptr<TStringList> list (new TStringList());
// ... codeing ...
}
各メンバ変数や関数へのアクセス方法は変わらない。
ただし、スマートポインタの特性としてポインタのコピーが行えない、あるいは一癖あるためポインタ自体を持ちまわる場合にはあまり向いていない。
レスポンスについて
上記のようにnew-delete、あるいはスマートポインタの宣言を繰り返すだけのコードを使ってレスポンスがどれだけ変わるか確認した。
そこそこのマシンで処理を1億回ぶん回したら、new-deleteの場合約11秒、スマートポインタは約13秒程度で処理された。若干new-deleteの方が処理スピードが速い。スマートポインタでは別途delete処理が呼び出されるため、そこが関わっているのだろう。
性能を限界まで詰める案件でもない限りはスマートポインタを積極的に使っていけばよいだろう。
Discussion