スポンサーリンク

| キーワード:

std::unique_ptr<>

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ではないので、コンピュータの気まぐれでいつ解放されるかわからない、という不安もついてこない。

 

 

———————-

書きかけかも?

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: