为什么我有内存泄漏
Why am I having memory leaks?
我使用VLD来检测我用c++编写的游戏中的内存泄漏。直到最近,它才报告说没有任何泄漏。我有一个SettingsManager类(所有静态方法),它加载设置并可以保存它们(文件I/O)。下面是我如何将"key=value"设置列表加载到vector:
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;
}
因此,这分配了Settings(这是一个带有两个std::string变量的简单结构体)。我从我用以下方法调用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);
}
}
当我调试时,在deletessettings调用之后,向量中的所有元素都是Bad Ptr的(Visual Studio 2010 Express)。如果我在删除语句之后给*赋值NULL,它们都是NULL。所以我真的看不出为什么这会给我内存泄漏。
有人知道吗?谢谢!
continue
语句导致至少一个泄漏。循环的开始分配一个新的Setting
值,并继续离开循环体,而不释放内存。您需要删除它以防止泄漏。
Setting* s = new Setting;
getline(file, line);
if(line.empty()) {
delete s;
continue;
}
总的来说,虽然你在这里玩手动内存管理,很容易出错。我强烈建议您考虑使用像shared_ptr<Setting>
这样的类型,而不是原始的Setting*
。它将使你的代码更加健壮
move
Setting* s = new Setting;
到continue循环之后,这将解决您的问题。
编辑:我会更详细地解释。你正在为每一行创建一个新的设置对象,包括空行。但是,只有非空行的设置对象才存储在容器中,我假设您稍后会使用它来释放内存。
通过将创建设置对象的代码放在求空行语句之后,您应该可以解决此问题。
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存