2013年11月12日火曜日

C++ new/delete演算子の応用

オブジェクト以外も動的にメモリ確保ができます。^^
new演算子とdelete演算子を使って、int型やchar型などもメモリ確保と解放ができます。

int型のメモリ確保と解放
new演算子とdelete演算子を使ってint型のメモリを動的に確保/解放する例を示します。
C言語のmalloc()関数より、new演算子のほうが若干簡単な記述になっています。

new, deleteを使用
int *pNum = new(std::nothrow) int;    //メモリ確保できなかったらNULLを返すように
if (pNum != NULL) {                          //NULLでない事を確認して解放
    delete pNum;                              
    pNum = NULL;                            //未使用になったらNULL代入
}

malloc(), free()を使用
int *pNum = (int *)malloc(sizeof(int));
if (pNum != NULL) {                          //NULLでない事を確認して解放
    free(pNum);
    pNum = NULL;             //未使用になったらNULL代入
}

new, deleteの方のstd::nothrowは前回確認した例外を発生させずにNULLを
返すようにするための記述です。
また、malloc, free版にも共通している解放時のNULLチェックおよび解放後の
NULL代入は忘れずに書くクセをつけるとよいでしょう。(^^)


配列用のメモリ確保と解放
new演算子を使って、配列用のメモリ確保もできます。

int *pNum = new(std::nothrow) int[100];

[ ]の中に必要な要素数を記述します。この例ではint型のメモリ領域を
100個用意してみました。

次はnew演算子で確保した配列用のメモリ解放についてです。
これは配列名の前に [ ] を記述します。
もし、[ ] を忘れると配列の最初の要素しか解放されませんので要注意です。(^_^;)

delete [] pNum;   //このとき、要素数は記述しません


オブジェクトの配列のメモリ確保と解放
最後はオブジェクトの配列を確保/解放する場合についてです。
この場合も書き方は同じです。以下に例を示します。

PeachBox *pPeachBox = NULL;
pPeachBox = new(std::nothrow) PeachBox[24];
        :
if (pPeachBox != NULL) {
    delete [] pPeachBox;  //要素数は記述しませんので注意してください
    pPeachBox = NULL;
}

動的なメモリ確保のためのnew, deleteバリバリ使ってみてください。^^

今日の名言
どうすれば物事に熱中できるだろうか。まず自分の手がけている事柄のどんなところが
好きか自分に言い聞かせて、嫌いな部分は捨てて、さっさと好きな部分へ移ることだ、
それから夢中になって行動する-誰かに自分の好きな部分について聞かせる。
なぜそうした事に興味があるのか、教えてやる。
                                    デール・カーネギー

我々は自分が胸に温めてきた計画の廃墟を積み重ねて、天へ向かう。失敗だと思って
いたものが、実は成功だったということに気づきながら。
                            エイモス・ブロンソン・オルコット

苦さの味を知らぬ者は、甘さも分からない。
                                    ドイツの格言

困難とは作業衣を着た好機会にすぎない。
                                ヘンリー・J・カイザー