Исключение во время удаления [] после memmove

У меня есть код ниже, который содержит динамический массив строк. У меня проблемы с освобождением каждой отдельной строки, которая генерируется. Я предполагал, что мог бы просто включить новый цикл 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;

2

Решение

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

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

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

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

Самое простое прямое исправление, учитывая ваш код, это вставить

data[index] = 0;

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]