[備忘] メモリの話

動的メモリのリサイズについて。
動的配列のサイズを変更したいときの話なんですが、今まではそのデータをテンポラリ領域に退避して、元の領域をdeleteしてnewしなおして、退避したデータをコピーし直してみたいなことをしてたんですが、実は、そのテンポラリ領域のポインタをそのままコピってしまえば良いということに気付いた。
まあこんなの常識なのかもしれませんが。備忘メモとして。
つまり、

char* pszData;

として、

pszData = new char [256];

としたのを、サイズを512に増やしたい場合、

char* pszTemp;
pszTemp = new char [512];
try {
memset( pszTemp, NULL, 512 );
memcpy( pszTemp, pszData, 256 );
delete [] pszData;
pszData = new char [512];
memcpy( pszData, pszTemp, 512 );
} catch (...) {
}
delete [] pszTemp;

とするより、

char* pszTemp;
pszTemp = new char [512];
memset( pszTemp, NULL, 512 );
memcpy( pszTemp, pszData, 256 );
delete [] pszData;
pszData = pszTemp;

とした方が、より簡単で効率が良い。
pszDataはローカル変数でありながらグローバルなポインタなんですよね。つまり、最後にdeleteを忘れたらメモリーリークになる。つまり、その領域は確保されっぱなしってことなのよね。逆にいえば、deleteするまで再利用可能ということ。
これは今後も使いどころがありそう。

タイトルとURLをコピーしました