トップ «前の日記(2008-10-16) 最新 次の日記(2008-10-18)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|04|

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 の [] の有無の違いは何なの?

CとC++での例外処理、第5部

第 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.

_ [][いくら丼]飯

いくら丼。

_ [パットン将軍式 無敵の組織]パットン将軍式 無敵の組織

「パットン大戦車軍団」は見たことないですが。

4822241920