ぼく用あれこれまとめ

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()しても何の動作も行わないことが保証されてる。




参考文献

記事メニュー
目安箱バナー