2012-05-07 3 views
0

Я пытаюсь решить некоторые проблемы в своей программе, и, похоже, проблема связана с моим конструктором копирования или с моим деструктором. Я получаю исключение памяти.Создайте глубокую копию массива C++

любая помощь мне оценили Спасибо

ArrayStorage::ArrayStorage(const ArrayStorage &a):readArray(a.readArray),arraysize(a.arraysize) 
{ 
    readArray = new string[arraysize]; //create the array 

    memcpy (readArray,a.readArray,sizeof(string)*arraysize);//Copy the values of bytes from the location pointed at by the souce and destination. 
} 

ArrayStorage::~ArrayStorage(void) 
{ 
    delete[](readArray);//deconstuctor to delete the array. 
} 

это было бы лучше, чтобы скопировать массив, кроме тетсру:

for (int i = 0 ; i < arraysize ; i ++) 
    { 
     readArray[i] = a.readArray[i]; 
    } 

ответ

10

Вы не можете просто memcpy случайных объектов, вам действительно нужно скопировать их с помощью операторов копирования.

string скорее всего содержит указатель на хранилище, выделенное кучей. Если вы скопируете его поразрядным, вызов деструктора в исходной строке аннулирует данные «скопированной» строки.

Используйте это как std::copy, чтобы сделать это правильно.

#include <algorithm> 
... 
std::copy(a.readArray, a.readArray+arraysize, readArray); 
+0

как бы использовать std :: copy без использования векторов (не разрешено использовать векторы для этой работы)? извините, если это вопрос noobish. –

+1

Отредактировано. BTW, ваша инициализация, если 'readArray' в списке инициализаторов бесполезна в конструкторе копирования, вы перезаписываете его в теле. – Mat

+0

спасибо за это, но я получаю 2 ошибки, 1. Ни один экземпляр перегруженной функции «std :: copy» не соответствует списку аргументов. 2. Ни один оператор «+» не соответствует этим операндам: S –

6

Я не советую вам скопировать струны так, как вы делать. Поскольку строка содержит ссылку на кучную память, вы на самом деле копируете указатели, и поэтому строки в обоих массивах разделяют память. Это не очень C++ - ish и довольно опасно. Я бы посоветовал вам использовать оператор присваивания или конструкторы копирования для строк (да, сделайте цикл).

+1

Или даже используйте 'vector ', где выполнение глубокой копии так же просто, как 'vector newlist = oldlist;'. – Benj

+0

@Benj согласился - это лучший вариант, но не очень связанный с вопросом - он спрашивает, почему это не работает не так, как это сделать :) –

+0

Какой будет лучший способ скопировать массив? –

0

Строки также имеют динамическую память, поэтому вам придется пройти через каждую строку и сделать ее копию.

Исправление будет копировать каждую строку внутри вашего массива вместо memcopy. Исключение составляют две разные строки, имеющие один и тот же указатель на кусок памяти, и оба пытаются освободить его.

0

Этот код не имеет никакого смысла. Сначала вы инициализируете своих членов значениями, переданными объектом для копирования, через список инициализаторов. Затем вы выделяете память для одних и тех же членов и копируете все снова.

Скорее всего, вы копируете ненужные данные в неинициализированный указатель. Избавиться от списка инициализаторов :readArray(a.readArray),arraysize(a.arraysize).

+0

ну, список инициализаторов был сделан для того, чтобы избавиться от некоторых ошибок в парашюте, которые я получал. –

+0

@BrianPeach Список инициализаторов был причиной, по которой вы получили исключение памяти. – Lundin

Смежные вопросы