0

memcpy を使用して、構造体配列の要素を別の構造体配列にコピーしたいと考えています。これが、何らかの理由で私のプログラムを惨めに失敗させていると思います。また、最後にメモリを解放するにはどうすればよいですか?

struct FaultCodes
{
  string troubleFound;
  string causeCode;
  string actionCode;
  string paymentCode;
  string suppCode;
  u_int16_t multiplier;
};

struct JobFaultInfo
{
  static const size_t NUM_CODES = 5;
  FaultCodes codes[NUM_CODES];
};

FaultCodes codes[JobFaultInfo::NUM_CODES];
// I have populated codes with the data.

JobFaultInfo info;
memcpy(info.codes, codes, sizeof(FaultCodes)*JobFaultInfo::NUM_CODES);
4

3 に答える 3

6

コピーするオブジェクトがいわゆる POD (プレーンな古いデータ構造) である場合にのみ、memcpy の使用が許可されます。しかし、構造体には POD ではない std::string オブジェクトが含まれています。したがって、構造体全体が POD ではありません。

代わりに、アルゴリズム ヘッダーから std::copy を使用してください。

于 2010-10-15T05:31:05.733 に答える
6

std::stringは通常、文字を格納する場所へのポインタが含まれています。memcpy文字列ごとに使用するstd::stringと、そのメモリの割り当てを解除する必要があると考える 2 つのインスタンスが得られます。バン。

代わりにstd::copyfromを使用できます。<algorithm>

さらに良いことstd::vectorに、生の配列の代わりに a を使用します。

乾杯 & hth。

于 2010-10-15T05:33:28.117 に答える
2

std:: ドメインに入った瞬間に memcpy が使えなくなります。これは、文字列を含むすべての std コンテナーがデータを他の場所に格納し、そのデータのポインターを自分自身にのみ保持するためです。そのため、(memcpy のように) ビットごとのコピーを単純に行うと、何をコピーしたのか正確にはわかりません。
提案されているように、プレーン配列と memcpy を使用する代わりに、それぞれ vector と std::copy を使用します。これらには memcpy のような高速コピーの利点はありませんが、前者の方法よりもはるかに信頼性が高くなります。
それでも memcpy に固執したい場合は、説明したように文字列を使用できません。構造体には、静的 (スタック) メモリの 2 次元の char 配列があります。チャット [5][MAX_STRING_LEN]。構造内のすべての文字列は、この配列の各要素にマップする必要があります。これで、構造体は純粋なデータで構成され、ポインターがないため、memcpy を使用できます。
ただし、これを行わないでください。単純に std::copy で vector を使用してください。

于 2010-10-15T05:55:16.037 に答える