Содержит ли это утечку памяти?

Содержит ли код ниже утечку памяти. Я подозреваю, что это так, но инструменты, которые я использую для их обнаружения (тест 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];

0

Решение

Да, это так. Когда вы удаляете

delete[] data;

Вы освобождаете память, выделенную для данных. Однако память выделена

data[i] = new char[numOfChars];

до сих пор не освобожден.

Вы должны перебрать data и удалить каждый data[i] перед удалением данных.

Как правило, вы должны убедиться, что у вас есть как можно больше deleteкак news.
Здесь у вас есть 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

2

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

Правило таково: для каждого «нового» ДОЛЖЕН быть соответствующий вызов «удалить». У вас этого нет, поэтому у вас есть утечка.

1

Да, у вас есть утечка!

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

//delete each array
for(int i = 0; i <numOfStrings; i++)
delete[] data[i];

//this is a single pointer, not an array
delete[] data;

Теперь у вас не будет утечки

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