Утечка памяти в C / C ++? - PullRequest
       27

Утечка памяти в C / C ++?

8 голосов
/ 03 ноября 2010

Я использую STL string в своем приложении, и недавно я тестировал его на утечки памяти, и я заметил, что многие мои строки не были должным образом освобождены к концу программы.

Я протестировал следующий код (не дословно) с одной из строк:

const string* cppString = &obj->objString;
const char* cString = cppString->c_str();
delete obj;

После этого я установил точку останова и заметил, что, хотя string это cppString указывает на то, что больше не существует, cString все еще указывал на строку в стиле C, которая, безусловно, была той, которую не удалось освободить в конце.

Я что-то упустил с точки зрениякак работают строки C / C ++?Как я могу получить представление C строки, которая также должна быть освобождена?

РЕДАКТИРОВАТЬ: Еще немного информации.Мой класс obj имеет тип Dialog, который наследует Popup.Я подумал, что это могло быть так, поскольку, когда я удаляю obj, я воспринимаю это как Popup*, но я попробовал это в небольшой отдельной программе, и удаление как родительский класс правильно удаляет дочерние переменные-члены(что, конечно, имеет смысл).

Я использовал трассировку утечки памяти в VS, и она показывает, что строка, которая заканчивалась утечкой, была той, которая была создана, когда я сделал Dialog и установилobjString на строку, переданную в качестве ссылки на конструктор.

Спасибо,
Jengerer

Ответы [ 2 ]

8 голосов
/ 03 ноября 2010

То, что вы видите, это неопределенное поведение - на самом деле это не утечка памяти.Память для строки C была освобождена (по крайней мере, насколько вам известно), но данные там все еще технически доступны.Когда вы освобождаете память, память обычно не стирается, поэтому данные там часто остаются до тех пор, пока память не будет повторно использована при последующем выделении.Поведение: вы можете получить данные до того, как они были освобождены, вы можете получить ненужные данные, вывести программу из строя или даже стереть жесткий диск (хотя это маловероятно).

Так долгопоскольку объект std::string должным образом освобождается, то любая память, используемая для его представления строки C, также будет освобождена.Вам не нужно беспокоиться об этом.


EDIT : Фактически получается, что ваш объект не был полностью уничтожен, потому что родительский класс Popup не имелвиртуальный деструктор.В результате деструктор для подкласса Dialog не вызывался, поэтому деструктор для экземпляра std::string не вызывался.

3 голосов
/ 03 ноября 2010

Скорее всего, проблема не в std::string, а в obj (независимо от типа). Обратите внимание, что вы удалили obj, а не cppString. Я предполагаю, что obj не хранит objString в классе интеллектуальных указателей и не удаляет objString в его деструкторе, и, следовательно, у вас есть утечка.

...