std :: wstringを使用した初期化構造
質問
次のような構造を持っています:
typedef struct
{
std::wstring DevAgentVersion;
std::wstring SerialNumber;
} DeviceInfo;
しかし、使用しようとすると、あらゆる種類のメモリ割り当てエラーが発生します。
次のような関数に渡そうとした場合:
GetDeviceInfo(DeviceInfo *info);
使用する前に初期化していないという文句のランタイムチェックエラーが表示されますが、修正済みのようです:
DeviceInfo *info = (DeviceInfo*)malloc(sizeof(DeviceInfo));
しかし、関数では、構造体のいずれかのスティングを設定しようとすると、文字列に値を設定しようとしたときに不良ポインターにアクセスしようとしていると文句を言います。
この構造を初期化する最良の方法は何ですか(およびすべての内部文字列ですか?
解決
malloc
の代わりに new
を使用して、コンストラクターが DeviceInfo
およびそれに含まれる wstring
s。
DeviceInfo *info = new DeviceInfo;
一般に、C ++で malloc
を使用することは避けるのが最善です。
また、使用が終了したら、必ずポインターを delete
してください。
編集:もちろん、ローカルスコープで info
のみが必要な場合は、ヒープに割り当てるべきではありません。代わりにこれを実行してください:
DeviceInfo info; // constructed on the stack
GetDeviceInfo( &info ); // pass the address of the info
他のヒント
std :: wstringはオブジェクトを作成し、オブジェクトを構築する必要があります。 mallocを使用することで、すべてのメンバーのコンストラクターを含む構造のコンストラクターをバイパスしました。
取得しているエラーは、まだ初期化されていない独自のメンバーの1つを使用しようとするstd :: wstringからのものです。
mallocの代わりにnewを使用できますが、おそらく最善の解決策はローカルの一時変数を使用し、そのアドレスを関数に渡すことです。
DeviceInfo info;
GetDeviceInfo(&info);
関数を構造体に追加します:
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 {...} name;に注意してください。 C ++ではパターンは必要ありません。何らかの理由でこれに無料の機能を使用する必要がある場合は、リファレンスを使用してください:
WhatEverReturnType GetDeviceInfo(DeviceInfo &info) {
// do your calculation. info.DevAgentVersion and info.SerialNumber are visible.
}
DeviceInfo d; WhatEverReturnType e = GetDeviceInfo(d);