2008-10-17 :-)
_ 朝
0530 起床。
_ 仕事
0830 出勤。
_ マイナス指向がアイマス指向に見えた
目が疲れてるんです。
_ [delete][C++]delete と delete[]
以下のようなコードを見ました。
char* p; p = new char[ 32 ]; : delete p;
Visual Studio C++ 2005 でビルドしてもとくに何も言われない。
でも正解はこうだよねー。
char* p; p = new char[ 32 ]; : delete [] p;
なにが違うの?
delete の [] の有無の違いは何なの?
第 5 部では、C++ の演算子 new と delete に関連する例外処理を説明します。
「配列 new と delete」 に説明があります。
delete[] p; は次のように分解されます。 for (std::size_t _i(_N_of(p)); _i > 0; --_i) D::~D(&p[i-1]); operator delete[](p);
N 個のオブジェクトを delete する、と。
Effective C++ 「16 章 対応する new と delete は同じものを使おう」にも説明があります。
下のコードは何が悪いでしょう。
std::string *stringArray = new std::string[100]; ... delete stringArray;
もしかすると、正しいコードに見えるかもしれません。new に対して delete がちゃんとあります。しかし、間違いなのです。このプログラムの振る舞いは未定義です。少なくとも、配列 stringArray が持つ 100 個の string オブジェクトのうち 99 個は正しく破棄されないでしょう。それらのデストラクタはおそらく呼び出されないのです。[以下略] ( p.73 )
Effective C++ くらいはマスターしておくべきかー。
4894714515
_ [メモリリーク][MFC]MFC におけるメモリ リークの検出
環境 Microsoft Visual C++ 2005
VC++2005 で普通に MFC プロジェクトを生成すると DEBUG_NEW は define される。
#ifdef _DEBUG #define new DEBUG_NEW #endif
変数名が誤ってるので注意。頭文字は小文字が正しい。
// AfxMemDF = allocMemDF | delayFreeMemDF | checkAlwaysMemDF; afxMemDF = allocMemDF | delayFreeMemDF | checkAlwaysMemDF;
コードを追加。
#ifdef _DEBUG CMemoryState oldMemState, newMemState, diffMemState; oldMemState.Checkpoint(); #endif CString s("This is a frame variable"); CString* p = new CString( "CC" ); #ifdef _DEBUG newMemState.Checkpoint(); if( diffMemState.Difference( oldMemState, newMemState ) ) { TRACE( "Memory leaked!\n" ); diffMemState.DumpStatistics(); } #endif
diffMemState.DumpStatistics() による印字。
Memory leaked! 0 bytes in 0 Free Blocks. 92 bytes in 3 Normal Blocks. 0 bytes in 0 CRT Blocks. 0 bytes in 0 Ignore Blocks. 0 bytes in 0 Client Blocks. Largest number used: 0 bytes. Total allocations: 92 bytes.
checkAlwaysMemDF を有効にすると、new または delete を呼び出すたびに、MFC が AfxCheckMemory 関数を呼び出します。
こんな印字。
Detected memory leaks! Dumping objects -> f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {168} normal block at 0x003BFF20, 22 bytes long. Data: < 9Px > AC 39 50 78 02 00 00 00 02 00 00 00 01 00 00 00 g:\miwa\work\mfc\mem\mem\mem.cpp(48) : {167} normal block at 0x003BFEE0, 4 bytes long. Data: <0 ; > 30 FF 3B 00 Object dump complete.