Содержит ли код ниже утечку памяти. Я подозреваю, что это так, но инструменты, которые я использую для их обнаружения (тест Visual Studio + Parasoft c ++), ничего не отмечают. Если это так, как бы я это исправить?
//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);
delete[] data;
РЕДАКТИРОВАТЬ:
Я должен отметить, что я пробовал перебирать каждую отдельную строку, как показано ниже, но возникает исключение.
for(int i = 0; i< numOfStrings; i++)
delete [] data [i];
Да, это так. Когда вы удаляете
delete[] data;
Вы освобождаете память, выделенную для данных. Однако память выделена
data[i] = new char[numOfChars];
до сих пор не освобожден.
Вы должны перебрать data
и удалить каждый data[i]
перед удалением данных.
Как правило, вы должны убедиться, что у вас есть как можно больше delete
как new
s.
Здесь у вас есть numOfStrings + 1
new
и только один delete
,
Еще одна утечка
Так как вы делаете
int index = 1, boundary = 5, sizeToMove = (boundary - index) * sizeof(numOfChars);
memmove(&data[index + 1],&data[index],sizeToMove);
(Вы перемещаетесь не на пять мест, как вы думали, а на 4 места (5 - 1 = 4)
)
После этой операции
data[2] will get the value of data[1]
data[2] <- data[1]
data[3] <- data[2]
data[4] <- data[3]
data[5] <- data[4]
И на что указал data[5]
будет потеряно.
data[2], data[1]
будет иметь одинаковое значение (указать на то же место)
Это также может объяснить, почему вы получаете segfault, когда вы хотите удалить, повторяя data
Правило таково: для каждого «нового» ДОЛЖЕН быть соответствующий вызов «удалить». У вас этого нет, поэтому у вас есть утечка.
Да, у вас есть утечка!
Вы должны удалить каждый указатель в массиве перед удалением указателя, указывающего на них.
//delete each array
for(int i = 0; i <numOfStrings; i++)
delete[] data[i];
//this is a single pointer, not an array
delete[] data;
Теперь у вас не будет утечки