2

私は次のような構造を持っています:

typedef struct
{
    std::wstring DevAgentVersion;
    std::wstring SerialNumber;

} DeviceInfo;

しかし、それを使おうとすると、あらゆる種類のメモリ割り当てエラーが発生します。

これを次のような関数に渡そうとすると、次のようになります。

GetDeviceInfo(DeviceInfo *info);

使用する前に初期化していないことを示すランタイムチェックエラーが発生します。これは修正したようです。

DeviceInfo *info = (DeviceInfo*)malloc(sizeof(DeviceInfo));

しかし、関数で、いずれかの構造体の針を設定しようとすると、文字列に値を設定しようとしたときに不正なポインターにアクセスしようとしていると文句を言います。

この構造(およびそのすべての内部文字列)を初期化するための最良の方法は何ですか?

4

3 に答える 3

10

newの代わりにを使用して、コンストラクターがとに含まmallocれるを確実に呼び出すようにする必要があります。DeviceInfowstring

DeviceInfo *info = new DeviceInfo;

malloc一般に、 C++での使用は避けるのが最善です。

また、使いdelete終わったらポインタを確認してください。

編集:もちろんinfo、ローカルスコープでのみ必要な場合は、ヒープに割り当てないでください。代わりにこれを行ってください:

DeviceInfo info; // constructed on the stack
GetDeviceInfo( &info ); // pass the address of the info
于 2008-11-25T19:09:04.257 に答える
1

std::wstring はオブジェクトを作成し、オブジェクトを構築する必要があります。malloc を使用することで、すべてのメンバーのコンストラクターを含む構造体のコンストラクターをバイパスしました。

あなたが得ているエラーは、まだ初期化されていない独自のメンバーの 1 つを使用しようとしている std::wstring からのものです。

malloc の代わりに new を使用できますが、おそらく最善の解決策は、ローカル一時変数を使用してそのアドレスを関数に渡すことです。

DeviceInfo info;
GetDeviceInfo(&info);
于 2008-11-25T19:14:41.347 に答える
1

関数を構造体に追加します。

struct DeviceInfo
{
    std::wstring DevAgentVersion;
    std::wstring SerialNumber;
    WhatEverReturnType GetDeviceInfo() {
        // here, to your calculation. DevAgentVersion and SerialNumber are visible.
    }
};

DeviceInfo d; WhatEverReturnType e = d.GetDeviceInfo();

typedef struct { ... } 名に注意してください。パターンは C++ では必要ありません。なんらかの理由でこれに無料の関数を使用する必要がある場合は、参照を使用してください。

WhatEverReturnType GetDeviceInfo(DeviceInfo &info) {
    // do your calculation. info.DevAgentVersion and info.SerialNumber are visible.
}

DeviceInfo d; WhatEverReturnType e = GetDeviceInfo(d);
于 2008-11-25T19:18:38.780 に答える