Да, в вашем коде происходит утечка памяти. Ваша первая догадка о поведении верна. Этот код
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node(); // allocate memory 10 times in a loop...
}
delete newNode; // ... but free the memory only once!
выделяет память 10 раз (оператор new
внутри цикла for
), но освобождает память, используемую только одним из этих объектов (оператор delete
внизу). Естественно, это оставляет остальные 9 объектов бесхозными — память, которую они потребляют, по-прежнему выделена, но теперь у вас нет доступа к ней, чтобы освободить ее. Это, конечно, само определение утечки памяти.
Напротив, этот код
Node *newNode;
for (int i = 0; i < 10; i++)
{
newNode = new Node(); // allocate memory 10 times in a loop
delete newNode; // ... and free the memory each time
}
не приводит к утечке памяти, потому что на каждый вызов new
приходится один вызов delete
. Это большое правило, которое вы должны помнить: если вы не сопоставите каждый вызов new
с соответствующим вызовом delete
, у вас будет утечка памяти.
Или, возможно, даже лучшее правило, когда вы работаете на C++, никогда не использовать необработанные указатели. Стандартная библиотека C++ предоставляет несколько отличных классов-оболочек, которые реализуют идиому RAII для указателей, которая гарантирует, что объекты, на которые указывают указатели, будут правильно уничтожены и, следовательно, память, которую они потребляют, будет освобождена. Начните свое исследование либо с вашей любимой книги по C++, либо с Википедия.
person
Cody Gray
schedule
14.03.2013