0

Имеет ли код ниже утечку памяти. Я подозреваю, что это не так, но инструменты, которые я использую для их обнаружения (Visual Studio + Parasoft C++ test), ничего не мешают. Если это так, я могу это исправить?Имеет ли это утечку памяти?

//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; 

EDIT:

Я должен упомянуть, я попытался итерация каждой отдельной строки, как показано ниже, но происходит исключение.

for(int i = 0; i< numOfStrings; i++) 
    delete [] data [i]; 
+2

@NuclearGhost: Нет, не следует. Этот вопрос касается определения и исправления конкретной проблемы в части кода. Обзор кода предназначен для тех случаев, когда у вас есть фрагмент кода, для которого вы хотите, чтобы предложения улучшались в любой области. –

+0

Не используйте 'new'; Лучше использовать 'std :: vector', или в случае' char ',' std :: string'. –

ответ

1

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

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

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

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

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

+0

Это то, что я изначально предполагал, что должен делать, но вызывает исключение, когда я вхожу в цикл for. – user2211776

+0

Я не понимаю ваш второй комментарий и почему вы изменили 'delete [] data;' to 'delete data;' - Да, это единственный указатель, а не массив. Вы не используете 'delete' или' delete [] 'на массивах, вы используете их в указателях. Но он указывает на первый элемент динамически распределенного массива. 'char ** data = new char * [numOfStrings];' - So 'delete [] data;' был правильным. –

2

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

delete[] data; 

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

data[i] = new char[numOfChars]; 

по-прежнему не освобожден.

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

Как правило, вы должны быть уверены, что у вас есть столько delete s, сколько new s.
Здесь у вас есть numOfStrings + 1new s и только один 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

+0

Я уже пробовал это, но это происходит. Я обновил исходный пост с помощью кода. – user2211776

+0

вы должны сделать это перед удалением 'data' – 2013-04-01 19:18:31

+0

Вот где я его разместил, когда я попробовал. Это первый вызов для удаления [] данных [i] в ​​цикле, который вызывает исключение. – user2211776

1

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

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

  • Нет связанных вопросов^_^