2010-10-15 3 views
0

Я хочу скопировать элементы массива struct в другой с помощью memcpy. Я считаю, что это приводит к тому, что моя программа терпит неудачу по какой-то причине. Также как я могу освободить память в конце?C++ struct array copy

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); 

ответ

6

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

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

6

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

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

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

Cheers & hth.

+0

спасибо alot .. gee, как я мог этого не знать: P ... – nixgadgets

2

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

+0

спасибо за связку. действительно очень хорошее объяснение. Ive уже начал использовать векторы. Даже не уверен, почему я пошел по пути использования массивов: S ... – nixgadgets