Visual Studio 2005/2008 CAtlArrayの中身表示のように今回もVisual Studio 2005のデバッグウィンドウのウオッチにCAutoPtrArrayを展開する方法を紹介する。
CAutoPtrArray
このクラスは、ATLにおける自動ポインタ配列実装クラスである。vector < auto_ptr >に意味的には同じだが、vector < auto_ptr >は実際には使うのはお勧めしない。使うとすれば、boostを用いてvector < shared_ptr >を使った方がよい。
さて、このCAutoPtrArrayであるが、標準では、以下のように中身を入れても展開されないため、そのつどm_pData,10などと書いたりして展開しなくてはならない。我々が見たいのはたいてい中身であるためそれはまどろっこしい。
- {...} ATL::CAutoPtrArray < int >
- ATL::CAtlArray < ATL::CAutoPtr < int >, ATL::CAutoPtrElementTraits < int > >
{ m_pData=0x003a8310 m_nSize=3 m_nMaxSize=5 ... }
ATL::CAtlArray < ATL::CAutoPtr < int >, ATL::CAutoPtrElementTraits < int > >
+ m_pData 0x003a8310 { m_p=0x003a8250 } ATL::CAutoPtr< int > *
m_nSize 3 unsigned int
m_nMaxSize 5 unsigned int
m_nGrowBy 0 int
autoexp.dat
autoexp.datは、Visual Studio 2005のウォッチ展開フォーマットを記入するファイルだが、今回は以下の内容を追加してみた。
ATL::CAutoPtrArray<*>{
children
(
#array
(
expr : (*($c.m_pData)[$i].m_p),
size : $c.m_nSize
)
)
preview
(
#(
"[",
$e.m_nSize ,
"](",
#array
(
expr : (*($c.m_pData)[$i].m_p),
size : $c.m_nSize
),
")"
)
)
}
入れる場所は、まだよくわかっていないが、[Visualizer]タグの下に入れている。とりあえずこのように書くだけでうまく展開してくれるようになった。

なお、上の画像ではAdd( CAutoPtr < int > ( new int ) )というのを追加しているのだが、ここで単にAdd()として中身を追加しない場合、
- [1](...,...) ATL::CAutoPtrArray<int> [0] CXX0030: エラーです: 式を評価できません
このような感じになってしまう。


ピンバック: Visual Studio 2008 ウオッチにCAtlListの中身表示 | 豆知識