忘れられない激○○料理

以下のように構造体を new で動的に確保したときに
構造体の中身(char bbb[10], int ccc)をゼロで初期化したいのですが
ZeroMemory を使用するとCArrayのAdd()を使用したときにエラーになってしまいました。

何かよい方法がありましたら教えて下さい。お願いいたします。

# 簡単にイメージですが・・・
typedef struct
{
CString a;
CString b;
}aaa_t ;

struct s_aaa{
char bbb[10];
int ccc;
CArray<aaa_t,aaa_t> m_aaaArray ;
}

s_aaa *StructB;

StructB = new s_aaa [10];

A 回答 (3件)

ZeroMemory( StructB, sizeof( s_aaa) * 10);



とかやってるならNGですね。m_aaaArrayも0クリアしてるので管理情報を破壊しています。
基本的にクラスを0クリアしてはいけません。そのクラスのコンストラクタにお任せする物です。

対策案1
 newしたあと、構造体のbbb[10]とcを自前で0クリアする。
 →面倒だし汚い。

対策案2
 struct s_aaaをclass s_aaaに置き換え、コンストラクタでbbb[10]とcを0クリアする。
 →これが普通の対応。

対策案3
 struct s_aaaのままコンストラクタを作成し、bbb[10]とcを0クリアする。
 構造体もコンストラクタはおけます。
 →美しくない。classにしない意味もない。
    • good
    • 0
この回答へのお礼

>ZeroMemory( StructB, sizeof( s_aaa) * 10);

まさしく、この処理を行っていたのが原因でした。

>struct s_aaaをclass s_aaaに置き換え、コンストラクタでbbb[10]とcを0クリアする。

この方法で無事に動作しました!!
C++の構造体はclassと書いても大丈夫だったり、構造体の中にコンストラクタを書けたりと非常に勉強になりました。本当にありがとうございました。

お礼日時:2008/05/08 22:45

↓でどうでしょう。



std::fill(StructB, StructB + 10, s_aaa());
    • good
    • 0
この回答へのお礼

>std::fill(StructB, StructB + 10, s_aaa());

自分では詳しい原理を今ひとつ理解できませんでしたが、こういう方法もあるんですね。参考になりました。本当にありがとうございます。

お礼日時:2008/05/08 22:52

>ZeroMemory を使用するとCArrayのAdd()を使用したときにエラーになってしまいました。


肝心の部分が書かれていませんが、
要は struct s_aaa の中身を「のっぺりと」ゼロ埋めしたということですか?

CArray<> がどんなのかもわかりませんが、その内容すべてを破壊しているのではないですか?
    • good
    • 0
この回答へのお礼

>要は struct s_aaa の中身を「のっぺりと」ゼロ埋めしたということですか?

はい。その通りです。

> CArray<> がどんなのかもわかりませんが、その内容すべてを破壊しているのではないですか?

まさしくその通りでした。CArrayはクラスになるので、詳しい部分はよく理解できていませんが、中身を全部ゼロ埋めしたためにクラスの領域(言葉が適切ではないかもしれませんが・・・)を破壊していたのが原因のようです。

お礼日時:2008/05/08 22:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報