2009年2月21日
ULONG(const ULONG &)の罠
一緒に仕事している人がハマってた。昨日まで動いていたコードが少し変更したら動かなくなったと…まぁ、この世界じゃよくある話ですよね
言語はVC++、墜ちるところは一見DBアクセスの関数内。まぁ、CやC++はメモリ管理は自己責任なんで実際に墜ちる場所と原因の場所が異なることが多く原因が見つけにくい時が良くあります。まぁ、今回もそんなケースですかね。
以下のコードは、実際とは異なるわけですが…やりたいことはULONG型の領域をn個確保したいと言うことです。
ULONG *a = new ULONG(n);
1行だけであれば、すぐに変だとわかりますよね~まぁ、考えてみればあたり前なんですが…コンパイルエラーにはなりません
単にULONGで初期値が10の領域が1個だけ確保されて、そのアドレスがaに代入されます。
ULONG *a = new ULONG[n];
これなら、n個のULONGの領域が確保されます。()と[]で大違いですね~まぁ、実際のコードはもう少し入り組んでるので、この間違いを探すのに結構な時間を要してしまいました…二人がかりで
しかし、ULONGって以下のように定義されてるだけのはずなのにVSでインテリセンスが働くのが不思議なんですよね
理由がわかる人は教えてください。
typedef unsigned long ULONG;
以下のような感じで…でも、newを前に置くと効かないんですけどね。

で、わたしが今まで同様の罠に引っかからなかった理由を考えてみました。
ULONG *a = (ULONG *)malloc(n * sizeof(ULONG));
まったく、C++風じゃないんですけど…mallocで確保してましたとさ。わたしの場合newはインスタンスを作るものってイメージが強いので、基本型の領域を確保したい場合はmallocの方が好きなんですけどどうなんでしょうね。
VC++だとnewでメモリ領域が足りなかった場合try…catchしてないとデフォルトのメッセージボックスが表示されちゃうんですよね(Releaseモードの場合)~かと言って、newに例外書くのも気持ち悪いし…まぁ、mallocでもNULLチェックしなくちゃいけないので同じと言えば同じなんですけど。
![]() |
ひと目でわかるMicrosoft Visual C++ 2008 アプリケーション開発入門 (マイクロソフト公式解説書) 増田 智明 by G-Tools |
あ、typedefにミソがあるのかぁコレ
TrackBack URL :


