我正在使用VLD来检测我正在用C++编写的游戏中的内存泄漏。它直到最近才报告没有泄漏。我有一个SettingsManager类(所有静态方法)加载设置并可以保存它们(文件I/O)。以下是我会的“键=值”设置的列表加载到一个载体:为什么我有内存泄漏?
std::vector<Setting*> settings;
SettingsManager::loadFromFile(settingsLocation + "display" + settingsExtension, settings);
这个载体填写正确,我可以进一步处理数据。
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;
}
所以,这个分配设置(这是一个简单的结构具有两个的std :: string变量):在loadFromFile()方法被执行如下。
SettingsManager::deleteSettings(settings);
其被实现如下::
当调试时,deleteSettings后呼叫在向量的所有元素我从那里我调用loadFromFile方法用下面的方法调用删除它们是坏Ptr的(Visual Studio 2010 Express)。如果我在删除语句之后给它分配NULL,它们都是NULL。所以我真的没有理由为什么这会给我内存泄漏。
任何人有想法?谢谢!
使用'std :: unique_ptr',这个问题神奇地修复了它自己,或者变成了一个编译器错误,它可以帮助你手动修复它。 –
我们可能需要查看类“Settings”的头部以及其析构函数的代码。 – jdehaan
我不知道答案,这可能是误报。但是你可以做一件简单的事情。不要使用指针!如果你只是'std :: vector'而不是'std :: vector '那么肯定不会有任何泄漏。我看不出有什么好的理由来使用指针。 –
john