Я использую VLD для обнаружения утечек памяти в игре, которую я пишу на C++. До недавнего времени он сообщал об отсутствии утечек. У меня есть класс SettingsManager (все статические методы), который загружает настройки и может сохранять их (файл ввода-вывода). Вот как я бы загрузить список параметров «ключ = значение» в векторе:Почему у меня есть утечки памяти?
std::vector<Setting*> settings;
SettingsManager::loadFromFile(settingsLocation + "display" + settingsExtension, settings);
Этот вектор правильно заполнен, и я могу дополнительно обрабатывать данные. Метод LoadFromFile() реализуется следующим образом:
std::ifstream file;
file.open(filename);
if(file.is_open())
{
std::string line;
unsigned pos;
while(file.good())
{
Setting* s = new Setting;
getline(file, line);
if(line.empty())
{
// do not read empty lines
continue;
}
// parse to Setting
pos = line.find('=');
s->key = line.substr(0, pos);
s->value = line.substr(pos + 1);
// add to vector
settings.push_back(s);
}
file.close();
return true;
}
else
{
return false;
}
Таким образом, это выделяет Настройки (которая является простой структурой, состоящей из двух станд :: строковых переменных). Я удалить их оттуда, где я называю метод LoadFromFile следующим вызовом метода:
SettingsManager::deleteSettings(settings);
, который реализуется следующим образом:
void SettingsManager::deleteSettings(std::vector<Setting*>& settings)
{
for(std::vector<Setting*>::iterator it = settings.begin(); it != settings.end(); ++it)
{
delete (*it);
}
}
Когда я отладки, после deleteSettings называют все элементы в векторе являются Bad Ptr (Visual Studio 2010 Express). Если я назначу NULL на *, то после инструкции delete все они будут NULL. Поэтому я действительно не вижу причин, почему это дает мне утечки памяти.
У кого-нибудь есть идея? Благодаря!
использовать 'std :: unique_ptr', и проблема магически исправляет себя или становится ошибкой компилятора, которая помогает вам исправить ее вручную. –
Вероятно, нам нужно увидеть заголовок класса 'Настройки', а также код его деструктора. – jdehaan
Я не знаю ответа, это может быть ложным положительным. Но есть одна легкая вещь, которую вы можете сделать. Не используйте указатели! Если у вас просто есть 'std :: vector' not 'std :: vector ', то определенно не будет никаких утечек. Я не вижу никакой веской причины использовать указатели для этого. –
john