У меня есть код ниже, который содержит динамический массив строк. У меня проблемы с освобождением каждой отдельной строки, которая генерируется. Я предполагал, что мог бы просто включить новый цикл for, который освободил их, но это не сработало. Как я должен это делать?
//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;
Кроме того, что предполагает его название, memmove
на самом деле не «перемещать» байты. Копирует их (но, в отличие от memcpy
, он может сделать это правильно, даже если области источника и назначения перекрываются).
Следовательно, после «перемещения» содержимого из области источника в область назначения, те элементы, которые были расположены в не перекрываются запчасти до сих пор без изменений. Особенно, data[index]
без изменений, и, следовательно, совпадает с содержанием data[index+1]
после вашего memmove()
,
Следовательно, любая попытка delete [] data[index+1]
будет пытаться освободить ту же память, которая освобождается при выполнении delete [] data[index]
, Это незаконно.
Чтобы решить это, вам нужно установить data[index]
(или, вообще говоря, любая непересекающаяся часть области источника) 0
(или же nullptr
) после перемещения или принять другие меры, чтобы убедиться, что оно не удалено.
Самое простое прямое исправление, учитывая ваш код, это вставить
data[index] = 0;
до удаления петли.
Других решений пока нет …