Утечка памяти в цикле удаления - PullRequest
0 голосов
/ 17 июня 2011

"У вас есть утечки памяти в конце из-за логической ошибки в вашем цикле удаления."

Мой друг сказал это, а я не вижу.

for(int i=0; i<nrOfAvailableSeats; i++)
{
    delete passengers[i];
}
delete [] passengers;

Ответы [ 4 ]

4 голосов
/ 17 июня 2011

Вы начинаете с nrOfAvailableSeats, установленным в начальное значение (100), затем в течение времени выполнения программы оно может уменьшиться (так как у вас есть

nrOfAvailableSeats--;

в вашем коде) и поэтому, когда вы используете его в цикле, вы не будете delete некоторые объекты.

Как минимум, вы должны определить глобальную константу:

const int PlaneCapacity = 100;

и использовать его для инициализации nrOfAvailableSeats и в циклах создания и удаления массива.

2 голосов
/ 17 июня 2011

Это потому, что вы удаляете массив пассажиров после удаления только некоторых его элементов.Поэтому, когда вы делаете delete [] passengers;, некоторые ([i], [i + 1], ...) элементы могут остаться неосуществленными.

0 голосов
/ 17 июня 2011

Вы инициализировали все доступные места на 0 / null, поэтому на этапе очистки просто переберите все 100 элементов и удалите каждый элемент. (Редактировать: проверка на нулевой указатель перед удалением избыточна, не важно).

В качестве альтернативы используйте std :: vector, если вам разрешено использовать STL. Затем просто выполните итерацию по вектору и удалите их все, поскольку у вас будет только столько элементов в векторе, сколько вы на самом деле используете. (Если вы работаете только с push и pop).

Чтобы удалить что-либо из используемого вектора (который не будет полностью очищен), нужно поменять элемент, который вы хотите удалить, на vector.back(), затем удалить vector.back(), а затем pop_back(). Примечание: это делает недействительными любые итераторы, вам нужно будет назначить их должным образом, или в случае только одного элемента, который вы хотите удалить, просто вырвитесь из цикла итерации через break или return.

#include "Passenger.h"
#include "EconomyClass.h"
#include "FirstClass.h"
#include <vector>



int main()
{
std::vector<Passenger*> passengers

//add passengers the vector grows when needed, it does so by copying the items, which, in the 
//case of raw pointers like this, fast.
passengers.push_back(new FirstClass(name, purpose, chair));
passengers.push_back(new EconomyClass(name, purpose, food));

//delete all, starting from the back of the stack
//check the std::vector reference online for details
std::vector<Passenger*>::reverse_iterator start,end;
start = passengers.rbegin();
end = passengers.rend();

//iterate through all items, in this case, 2
for(;start!=end;++start)
{
delete *start;
}
//optional since it would get called on cleanup anyway)
passengers.clear();

}
0 голосов
/ 17 июня 2011

В связанном файле есть код: nrOfAvailableSeats--;

И когда вы освобождаете свои данные, у вас есть memleak, потому что nrOfAvailableSeats может быть <100 </p>

...