2009-08-13 1 views
3

Мне интересно, как удалить оператор [] в C++. (Я использую Visual Studio 2005).delete [] и утечки памяти

У меня есть неуправляемая DLL, вызываемая управляемой DLL. Когда я закрываю эту программу после выполнения нескольких задач во время отладки, я получаю много (тысяч?) Утечек памяти, в основном 24 байта - 44 байта. Я подозреваю, что это может быть связано с некоторой неуправляемой DLL, которую я имею.

Во всяком случае, от того, что я понимаю, если у меня есть следующий код:

char* pointer = new char[500] 
/* some operations... */ 
delete[] pointer; 

Тогда вся память для него освобождается правильно, я прав?

Что происходит, когда у меня есть следующий код:

char* pointer = new char[500]; 
char* pointerIt = pointer; 
/* some code perhaps to iterate over the whole memory block, like so */ 
for (int i = 0; i < 250; i++){ // only iterate halfway 
    *pointerIt = 0; 
    pointerIt++; 
} 

delete[] pointer; 

память, на которую указывает указатель будет удален правильно? Таким образом, это означает, что pointerIt теперь не указывает на действительную память. Но это нормально, потому что я могу установить оба указателя в NULL, не так ли?

Во всяком случае, то, что происходит сейчас, если я это сделать:

char* pointerFirstPosition = new char[500]; 
char* pointerIt = pointerFirstPosition; 

for (int i = 0; i < 250; i++){ // only iterate halfway 
    *pointerIt = 0; 
    pointerIt++; 
} 

delete[] pointerIt; // delete the pointer iterator... 

Будет ли этот код удалить блок памяти, на которую указывает pointerIt до pointerIt +500? или он удалит блок памяти, на который указывает pointerFirstPos, указателюFirstPos +500?

Может ли это привести к утечке памяти?

Извините за длинное сообщение, я пытаюсь четко разобраться в своем сообщении.

Спасибо,

Кребса

+1

«Но это нормально, потому что я могу установить как указатели на NULL, не так ли?» Ну, вы должны сделать это с указателями ... – GManNickG

ответ

4

Первый набор вопросов:

char* pointer = new char[500] 
/* some operations... */ 
delete[] pointer; 

Тогда вся память для него освобождается правильно, я прав?

правый.

Второй набор вопросов:

char* pointer = new char[500]; 
char* pointerIt = pointer; 
/* some code perhaps to iterate over the whole memory block, like so */ 
for (int i = 0; i < 250; i++){ // only iterate halfway 
    *pointerIt = 0; 
    pointerIt++; 
} 

delete[] pointer; 

память, на которую указывает указатель будет удален правильно? Таким образом, это означает, что pointerIt теперь не указывает на допустимую память .. Но это нормально, потому что я могу установить оба указателя в NULL, не так ли?

Память pointer имеет адрес, который полностью делит да. Оба pointer и pointerIt имеют адрес для недопустимой памяти. Каждый указатель - это просто переменная, и каждая переменная независима. Таким образом, оба сохраняют свой собственный адрес независимо друг от друга. Оператор разыменования * просто даст вам переменную по этому адресу. Переменная на этом адресе представляет собой переменную, отличную от переменной указателя.

Третий набор вопросов:

Вы должны удалить только адрес, который был выделен, весь массив. У вас будут неопределенные результаты, если вы попытаетесь удалить частичный массив. Может ли это привести к утечке памяти? Возможно, это может привести к краху? Возможно, это может привести к ...? Возможно.

Так что удаляйте только то, что вы выделяете. Если вы выделяете массив, то вы удаляете delete[], если вы удалите тип, который не является массивом, который вы удаляете с помощью delete.

Вот eample чего-то, что это хорошо только для ясности:

char* pointer = new char[500]; 
char* pointerIt = pointer; 
//This is fine because you are deleting the same address: 
delete[] pointerIt; 
//The memory that both variables point to is freed, do not try to free again 
+2

Невозможно «удалить» или «удалить []» ничего, кроме того, что было создано с помощью 'new' или' new [] '. – GManNickG

+0

Спасибо, это было то, что я подозревал. Но скажем, например, в третьем наборе вопросов, я устанавливаю pointerIt = pointerFirstPosition, а затем удаляю [] pointerIt, это еще не определено? Я работаю с другим OLD-кодом, он уже покинул компанию, и я пытаюсь выяснить, является ли это причиной утечек памяти. – krebstar

+0

Просто для ударов я тестировал это под g ++ 4.4.1 - в основном тот же код, что и у вас в третьем примере кода, за исключением того, что 'pointerIt' перемещен на полпути вниз по массиву. Вызов 'delete []' on 'pointerIt' делает недействительным' указатель', но, очевидно, этого поведения нельзя ожидать от каждого компилятора, если поведение не определено. –

0

выписка повышение :: shared_ptr или повышение :: scoped_ptr и никогда не беспокоиться об этом. Это дает вам статический справочный подсчет & для управления вашей памятью.

http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/shared_ptr.htm

+1

Если я это сделаю, мне придется изменить так много проектов .. :(Что-то мой менеджер не может оправдать. – krebstar

+0

Для будущего кода, а затем используйте 'std :: vector' и kin. * ever **. – GManNickG

+0

Хорошо, спасибо, ребята, очень полезно :) – krebstar