ソフト開発日誌 newとかdeleteとか

しってのとおり、C++のメモリ確保と開放は、newとdeleteを使って行われるのが一般的です。
mallocとかfreeも使うことはできますが、
クラス等のオブジェクト相手に使うときに非常に手間がかかるので、
滅多に使用されません。
newは、mallocと違って速度等を気にしなければ、非常に使いやすくて便利なのですが、
一部使いにくいところがあります。
それはどこかというと。
mallocでメモリを確保する際に、エラーが発生すると、NULLを返します。
newでメモリを確保する際に、エラーが発生すると、std::bad_allocの例外を発生させます。
一般には例外のほうがすばらしいと解釈されていますが、これが非常に厄介です。
JavaC#ならガベージコレクションが入っているため、まとめてエラーを検知できる例外は、
非常に便利です。しかし、C++のようなメモリを完全に管理しなければならない言語の場合は、
エラー発生時に自分の監視下から飛び出されると、さまざまな問題を発生させる時があります。
そのため、いろんな参考書では、スマートポインタを推奨しているのですが、
外部ライブラリの導入等をしなければいけないという制限があるので、
はっきりいって、スマートポインタを実用できている人は、そんなに多くないと思います。
昔のC++コンパイラは、newの失敗時に、NULLを返すようにしていたのですが、
それは、例外の仕組みが完全に実装されるまでの伏線なので、
現在のコンパイラでは、NULLを返すものはほとんどありません。
拡張設定等でNULLを返させることができるコンパイラもありますが、
クロスプラットフォーム開発となると、環境構築作業に手間がかかりすぎます。
つうことで、現在開発中のソフトウェアでは、マクロでnewとdeleteをラッパーして、
newの失敗時にNULLが返るようにしました。
ついでにNULLはdeleteが作用しないというC++の仕様を利用して、
delete時にNULLを代入するようにしました。
いちいちNULLを入れてたら少し重くなるやろ!とかいう意見はあると思いますが、
NULLを入れる処理を増やすだけで、使い物にならなくなるほうが問題だと思うので無視ですw
コード上もマクロなので1行です^^v
マクロじゃなくて、new operatorの定義という手もあったのですが、
しなかった理由は、グローバルのオーバーライドは恐いのと、ベースクラスを作るのが嫌だったからですw