悲しい。。。
だいぶ端折る。
void CreateList(CAtlList<CHoge> hogeList)
{
DWORD cnt; // 下の処理で、ここにデータ数が入る
LPBYTE orgData = /* リストの元データを取得する処理 */;
struct _orgHoge *p = (struct _orgHoge) orgData;
for (int idx = 0; idx < cnt; ++idx) {
CHoge item(p[idx]);
item.addr = new BYTE[256]; // このメンバがおかしなことになった
hogeList.AddTrail(item); // ここでコピー コンストラクタが動くのを失念
} // だって、ここで item がデストラクトされ、delete[] addr が...
free(orgData);
}
main()
{
CAtlList<CHoge> list;
CreateList(list);
POSITION p = list.GetHeadPosition();
while (p != NULL) {
// リストを表示する処理
}
}
C# と同じ感覚で使っていた。C# は参照型なので、CHoge クラスのインスタンス、item は、CreateList メソッドで作られたものがそのままリストに入り、main メソッドで使われます。
しかし、無印 C++ だと、CAtlList<CHoge> にストアされるのは、コピー コンストラクタでコピーされたインスタンスだった。。。
インスタンスの外で確保したメモリのアドレスだけ参照させていれば、参照だけコピーされるわけだ。でもって、デストラクタでそれを解放しようものなら、コピーされた方からはアクセスできないというわけだ...orz
あわててコピー コンストラクタを定義(オーバーライド)した。
「これでいいの?PRINTER_INFO_2 構造体」に飛ぶ。
そして、「item.addr = new BYTE[256];」は削除された。。。
投稿日時 : 2007年10月16日 22:20