我正在研究一个游戏引擎,在之前的一个问题中,我建议我开始使用boost :: ptr_vector来维护一个指针列表。
基本思想是拥有几个State,每个State都有一个SceneGraph。每个州都有几个他们初始化的资源,然后填充自己的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()输出内存泄漏日志报告。日志报告告诉我内存泄漏;
Detected memory leaks! Dumping objects -> {174} normal block at 0x00A56630, 32 bytes long. Data: <../media/img/bac> 2E 2E 2F 6D 65 64 69 61 2F 69 6D 67 2F 62 61 63 {173} normal block at 0x00A565A0, 8 bytes long. Data: < c > A8 63 A5 00 00 00 00 00 Object dump complete.
_CrtDumpMemoryLeaks()是否遇到过boost :: ptr_vector问题或者我做错了什么?调试器告诉我State调用它的析构函数(具有删除sceneGraph),并且我还验证了SceneGraph的析构函数也被调用。
非常感谢任何帮助,我很想看到空的内存泄漏报告: - )
答案 0 :(得分:2)
它肯定看起来不像你正在泄漏的矢量。请注意,该字符串是可读的,至少是一个提示。
如果你可以得到花括号之间的数字稳定(“{173}”)那么你可以在分配内存时得到一个断点。把它放在你的main()函数中:
_crtBreakAlloc = 173;
如有必要,请使用#include <crtdbg.h>
。重复174以找到另一个。
答案 1 :(得分:0)
好吧,你的代码可能是100%合法的。我有同样的问题,但使用Valgrind并使用boost :: ptr_vector。以下是用于测试目的的原型:
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/shared_ptr.hpp>
#include <map>
using namespace std;
class Object
{
public:
Object(){ abc=1;};
~Object(){cout<<"destructor Object"<<endl;};
int abc;
};
class test : public boost::ptr_vector<Object>
{
public:
test(){}
virtual ~test(){cout<<"destructor test"<<endl;}
void add(){
PARENT::push_back(new Object());
}
protected:
typedef boost::ptr_vector<Object> PARENT;
test(const test& abc);
};
typedef boost::shared_ptr<test> shared_type;
typedef std::map< int, std::pair<shared_type, shared_type> > maptype;
maptype::mapped_type get()
{
boost::shared_ptr<test> testObj(new test);
boost::shared_ptr<test> testObj2(new test);
test &ref= *(testObj.get());
test &ref2= *(testObj2.get());
ref.reserve(4);
ref.add();
ref.add();
ref.add();
ref.add();
ref2.reserve(4);
ref2.add();
return maptype::mapped_type(testObj,testObj2);
}
int main() {
std::map< int, std::pair<shared_type, shared_type> > mapped;
mapped.insert(maptype::value_type(1,get()));
return 0;
}
我在这里测试了一些内部结构,所以不关心设计。 输出是:
destructor test
destructor Object
destructor test
destructor Object
destructor Object
destructor Object
destructor Object
Valgrind也可以在这里抱怨,我想这是由于ptr_vector