何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 37042
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

悲しい。。。

だいぶ端折る。


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
コメント
  • # re: C++ を、すっかり忘れている件
    Craf
    Posted @ 2007/10/17 10:01
    そういうときのboost::shared_ptrと言ってみる
  • # re: C++ を、すっかり忘れている件
    Jitta
    Posted @ 2007/10/17 20:49
    Crafさん、コメントありがとうございます。

    > そういうときのboost::shared_ptr

    おお!なるほど。
    とりあえず、GetPrinter し直すように逃げました。
    う~ん、どうしよう。もう一回戻そうかな?
タイトル
名前
Url
コメント