Копирование массива структуры C ++ - PullRequest
0 голосов
/ 15 октября 2010

Я хочу скопировать элементы массива struct в другой, используя 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);

Ответы [ 3 ]

6 голосов
/ 15 октября 2010

A std::string обычно содержит указатель на место хранения символов. Используя memcpy для каждой строки, вы получаете два std::string экземпляра, которые оба считают, что им необходимо освободить эту память. Взрыва.

Вместо этого вы можете использовать std::copy из <algorithm>.

Но еще лучше, используйте std::vector вместо необработанного массива.

Приветствия и hth.

6 голосов
/ 15 октября 2010

Вы можете разрешить только использование memcpy в случае, если копируемые объекты являются так называемыми POD (обычные старые структуры данных).Но ваша структура содержит объекты std :: string, которые не являются POD.Таким образом, вся ваша структура не является POD.

Вместо этого используйте std :: copy из заголовка алгоритма.

2 голосов
/ 15 октября 2010

В тот момент, когда вы входите в домен std ::, вы не можете использовать memcpy. Это связано с тем, что все контейнеры std, включая строку, хранят данные в другом месте и хранят только указатели этих данных при себе. Поэтому, если вы просто делаете побитовое копирование (как в memcpy), вы точно не знаете, что скопировали.
Как предлагается, вместо использования простых массивов и memcpy используйте векторы и std :: copy соответственно. Это не даст преимущества быстрого копирования, как это делает memcpy, но гораздо надежнее, чем предыдущий метод.
Если вы все еще хотите придерживаться memcpy, то, как я объяснил, вы не можете использовать строку. В вашей структуре у вас будет двухмерный массив статической (стековой) памяти. чат [5] [MAX_STRING_LEN]. Все строки в ваших структурах должны быть сопоставлены с каждым из элементов этого массива. Теперь ваша структура будет состоять из чистых данных и без указателя, и, следовательно, вы можете использовать memcpy.
Но, пожалуйста, не делайте этого, просто используйте vector с std :: copy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...