【发布时间】:2010-07-13 21:02:17
【问题描述】:
我正在开发一个游戏引擎,在之前的问题中,有人建议我开始使用 boost::ptr_vector 来维护指针列表。
基本思想是有几个State,每个State都有一个SceneGraph。每个状态都有几个初始化的资源,然后填充自己的场景图。 SceneGraph 有一个 boost::ptr_vector,它将资源指针塞入其中。
以下是相关代码:
在 TestState 中创建资源并添加到 SceneGraph
backgroundImage = new DEBUG_NEW Fenris::Node2D::Image(std::string("backgroundImage"), std::string("../media/img/background.jpg"));
sceneGraph->addNode(backgroundImage, Fenris::Core::STRATUM_BACK);
场景图
boost::ptr_vector<SceneGraphNode> backStratumList;
// The add() method
void addNode(SceneGraphNode *pNode, STRATUM_TYPE stratumType) {
switch(stratumType) {
case STRATUM_BACK:
backStratumList.push_back(pNode);
break;
case STRATUM_NORMAL:
normalStratumList.push_back(pNode);
break;
case STRATUM_FOREGROUND:
foregroundStratumList.push_back(pNode);
break;
}
}
用相关行编辑 main.cpp
PlatformGame::State::TestState *testState = new DEBUG_NEW PlatformGame::State::TestState(std::string("testState"));
// Clean up the previously registered state (deletes its sceneGraph -- verified that the destructor is in fact called via debugger)
delete testState;
// Dump memleak report if we're running in debug mode
#ifdef _DEBUG
_CrtDumpMemoryLeaks();
#endif
我正在使用 _CrtDumpMemoryLeaks() 来输出内存泄漏日志报告。日志报告告诉我有内存泄漏;
检测到内存泄漏! 倾倒对象 -> {174} 0x00A56630 处的普通块,32 字节长。 数据:<..> 2E 2E 2F 6D 65 64 69 61 2F 69 6D 67 2F 62 61 63 {173} 0x00A565A0 处的普通块,8 字节长。 数据:_CrtDumpMemoryLeaks() 是否在 boost::ptr_vector 上遇到问题,还是我做错了什么?调试器告诉我 State 确实调用了它的析构函数(它有;delete sceneGraph),我还验证了 SceneGraph 的析构函数也被调用了。
非常感谢任何帮助,我希望看到一个空的内存泄漏报告 :-)
【问题讨论】:
-
检测内存泄漏的好工具是
valgrind。不幸的是,它没有 Windows 版本。 -
我也遇到了同样的问题,或许你可以参考这个:stackoverflow.com/questions/7543424/…
标签: c++ boost memory-leaks ptr-vector