スポンサーリンク
C++11のunique_ptr<>。これ基本的な考え方は大したことないんだが物凄く便利だ。
関数内でメモリを確保するときは、スタック領域に確保するかヒープ領域に確保するかの二通りの考え方がある。
スタック領域に確保する場合:
メリット:スコープを抜けたときに自動で解放してくれる
デメリット:あまり大きなメモリは確保できない , サイズが固定である
ヒープ領域に確保(new)する場合:
メリット:大きなメモリを確保できる , 実行時にサイズを指定できる
デメリット:明確なdeleteを忘れるとメモリリークを起こす
問題は、狭いスコープ内、例えば関数内、if文の{}内などでメモリを確保したくなり、サイズを実行時に指定したくしかも大きなサイズが必要というケースは頻繁にあるということだ。
少し余分に確保しておく、という方法が取れればそれでもいいが、そうでない限りnewを使うしかなくなる。すると同時にdeleteの義務が発生してしまうのである。
std::unique_ptrはこのような場合に用いることができる、
「スコープを抜けたら自動的に解放してくれるスタック変数のメリット」と
「大きな領域を動的に確保できるヒープのメリット」
を足したような素晴らしいポインタである。
#include <memory> #pragma warning(disable:4996) struct RGB { unsigned char r; unsigned char g; unsigned char b; }; int main() { int width; int height; scanf("%d %d", &width, &height); bool makeimage = true; //フラグが経っているときだけ画像を作成し、何かする if (makeimage == true) { std::unique_ptr<RGB[]> image = std::unique_ptr<RGB[]>(new RGB[width*height]); for (int i = 0; i < width*height; i++) { image[i].r = 0; image[i].g = 0; image[i].b = 0; } } return 0; }
このプログラムでは sizeof(char)×3×任意の値×任意の値 という、場合によっては巨大なメモリを動的に確保するが、delete [] の必要がない。書かなくても、ifブロックを抜けた時点で速やかに解放される。
GCではないので、コンピュータの気まぐれでいつ解放されるかわからない、という不安もついてこない。
----------------------
書きかけかも?