ぼく用あれこれまとめ
delete演算子
最終更新:
bokuyo
-
view
new/delete演算子
- 動的なメモリの確保、について最近やたらめったらそれ関係の話を訊くけど、そもそも、どうてきなメモリの確保とはいったい?ってことでnew/delete演算子についてまとめるページ。
まずよくある話から
- new/delete演算子をスカラ型、new[]/delete[]演算子をベクタ型という。
- ベクター=vector=配列のこと。配列をnewしたときは、delete[]演算子を使わなきゃだめってやつ。
- そういえば、new/deleteは演算子(かっこよく言えばオペレータ)、malloc/freeは関数。
newでメモリの割り当てに失敗するとどうなるの?
#include <iostream> int main() { int* eureka; int* renton; try { eureka = new int(156); } catch(std::bad_alloc ) { eureka = 0; } renton = new(std::nothrow) int(156); if(renton) { std::cout << *renton << std::endl; } return 0; }
- newで割り当てに失敗すると、「std::bad_alloc」例外をthrowする。
- ちなみに、そのときNULLポインタを返さない。
- new(std::nothrow)演算子を使うと失敗したときに、例外をthrowせずに、NULLポインタを返すようになる。
- 例外処理を書くときは、newなのか、nothrow型のnewなのかを考えて書くべき。
- ちなみに、C言語のmalloc演算子は失敗したらNULLポインタを返す。
- MFCのnew演算子の場合、CMemoryExceptionっていう例外を投げる。(MSDN - CMemoryException クラス)
- MFC = Microsoft Foundation Class: VC++用に作ったMS製のライブラリ
多重解放するとどうなるの?
- C99(Cの標準規格)では、free()したポインタに何度もfree()を行った場合の動作は未定義。
- ただし、NULLポインタをfree()しても何の動作も行わないことが保証されてる。