2013-04-01 4 views
2

У меня есть код, который содержит динамический массив строк. У меня возникают проблемы с освобождением каждой отдельной строки, которая сгенерирована. Я предположил, что могу просто включить новый цикл, который освободил их, но это не сработало. Как я должен это делать?Исключение во время удаления [] после memmove

//A dynamically allocated array of char pointers 
int numOfStrings = 10, numOfChars = 32; 
char** data = new char*[numOfStrings]; 

//Generate each each individual string 
for(int i = 0; i <numOfStrings; i++) 
    data[i] = new char[numOfChars]; 

//moves the elements 1-5 in the array to the right by one 
int index = 1, boundary = 5, sizeToMove = (boundary - index) * sizeof(numOfChars); 
memmove(&data[index + 1],&data[index],sizeToMove); 

for(int i=0;i < numOfStrings; i++) 
delete [] data[i]; //this line is causing an exception on its first call (I've also tried delete data[i]. 

delete[] data; 
+3

Было бы намного проще использовать инструменты C++. 'std :: vector data (numOfStrings);' –

+0

вы перемещаете память своего массива, вы не хотите брать адреса данных, а указатель указал на данные. также проверьте свой размер (numOfChars), потому что он эквивалентен sizeof (int), вы уверены, что хотите этого? –

ответ

2

Кроме того, что предполагает его название, memmove на самом деле не «двигаться» байты. Он копирует их (но, в отличие от memcpy, он может сделать это правильно, даже если область источника и назначения перекрывается).

Следовательно, после «перемещения» содержимого из области источника в область назначения те элементы, которые были расположены в , не перекрываются, частей по-прежнему не изменились. В частности, data[index] не изменяется и поэтому идентичен содержимому data[index+1] после вашего memmove().

Следовательно, любая попытка delete [] data[index+1] попытается освободить ту же память, которая освобождается при выполнении delete [] data[index]. Это незаконно.

Чтобы решить эту проблему, необходимо установить data[index] (или, вообще говоря, любой не перекрывая часть исходной области) в 0 (или nullptr) после переезда, или принять другие меры для обеспечения того, чтобы она не удаляется.

Самый простой прямой исправить данный код, чтобы вставить

data[index] = 0; 

до удаления петли.

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