关于错误0xC0000005: 读取位置 0x000001ac 时发生访问冲突
关于异常0xC0000005: 读取位置 0x000001ac 时发生访问冲突
最近在学ogre,学到ogre启动顺序时遇到问题,代码如下:
#include "Ogre\Ogre.h"
class MyFrameListener : public Ogre::FrameListener
{
public:
MyFrameListener()
{
listener = NULL;
}
~MyFrameListener()
{
delete listener;
}
bool frameStarted(const Ogre::FrameEvent& evt)
{
std::cout << "Frame started"<< std::endl;
return false;
}
bool frameEnded(const Ogre::FrameEvent& evt)
{
std::cout << "Frame ended"<< std::endl;
return false;
}
bool frameRenderingQueued(const Ogre::FrameEvent& evt)
{
std::cout << "Frame queued" << std::endl;
return false;
}
private:
Ogre::FrameListener* listener;
};
class MyApplication
{
private:
Ogre::SceneManager* _sceneManager;
Ogre::Root* _root;
friend class MyFrameListener;
public:
void loadResources()
{
Ogre::ConfigFile cf;
cf.load("resources_d.cfg");
Ogre::ConfigFile::SectionIterator sectionIter =cf.getSectionIterator();
Ogre::String sectionName, typeName, dataname;
while (sectionIter.hasMoreElements())
{
sectionName = sectionIter.peekNextKey();
Ogre::ConfigFile::SettingsMultiMap *settings = sectionIter.getNext();
Ogre::ConfigFile::SettingsMultiMap::iterator i;
for (i = settings->begin(); i != settings->end(); ++i)
{
typeName = i->first;
dataname = i->second;
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dataname, typeName, sectionName);
}
}
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
}
int startup()
{
Ogre::FrameListener* framelistener = new MyFrameListener();
_root->addFrameListener(framelistener);
_root = new Ogre::Root("plugins_d.cfg");
if(!_root->showConfigDialog())
{
return -1;
}
Ogre::RenderWindow* window = _root->initialise(true,"Ogre3DBeginners Guide");
_sceneManager = _root->createSceneManager(Ogre::ST_GENERIC);
Ogre::Camera* camera = _sceneManager->createCamera("Camera");
camera->setPosition(Ogre::Vector3(0,0,50));
camera->lookAt(Ogre::Vector3(0,0,0));
camera->setNearClipDistance(5);
Ogre::Viewport* viewport = window->addViewport(camera);
viewport->setBackgroundColour(Ogre::ColourValue(0.0,0.0,0.0));
camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));
loadResources();
createScene();
_root->startRendering();
return 0;
}
void createScene()
{
Ogre::Entity* ent = _sceneManager->createEntity("Sinbad.mesh");
_sceneManager->getRootSceneNode()->attachObject(ent);
}
MyApplication()
{
_sceneManager = NULL;
_root = NULL;
}
~MyApplication()
{
delete _root;
}
};
int main (void)
{
MyApplication app;
app.startup();
return 0;
}
错误是ogre3d.exe 中的 0x51f7d0b1 处最可能的异常: 0xC0000005: 读取位置 0x000001ac 时发生访问冲突,
调试后好像是startup()函数这出错了,但不清楚到底是函数的哪个地方错了,请高人指教
------解决方案--------------------
访问野指针了?
------解决方案--------------------
_root 似乎为NULL了
最近在学ogre,学到ogre启动顺序时遇到问题,代码如下:
#include "Ogre\Ogre.h"
class MyFrameListener : public Ogre::FrameListener
{
public:
MyFrameListener()
{
listener = NULL;
}
~MyFrameListener()
{
delete listener;
}
bool frameStarted(const Ogre::FrameEvent& evt)
{
std::cout << "Frame started"<< std::endl;
return false;
}
bool frameEnded(const Ogre::FrameEvent& evt)
{
std::cout << "Frame ended"<< std::endl;
return false;
}
bool frameRenderingQueued(const Ogre::FrameEvent& evt)
{
std::cout << "Frame queued" << std::endl;
return false;
}
private:
Ogre::FrameListener* listener;
};
class MyApplication
{
private:
Ogre::SceneManager* _sceneManager;
Ogre::Root* _root;
friend class MyFrameListener;
public:
void loadResources()
{
Ogre::ConfigFile cf;
cf.load("resources_d.cfg");
Ogre::ConfigFile::SectionIterator sectionIter =cf.getSectionIterator();
Ogre::String sectionName, typeName, dataname;
while (sectionIter.hasMoreElements())
{
sectionName = sectionIter.peekNextKey();
Ogre::ConfigFile::SettingsMultiMap *settings = sectionIter.getNext();
Ogre::ConfigFile::SettingsMultiMap::iterator i;
for (i = settings->begin(); i != settings->end(); ++i)
{
typeName = i->first;
dataname = i->second;
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(dataname, typeName, sectionName);
}
}
Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
}
int startup()
{
Ogre::FrameListener* framelistener = new MyFrameListener();
_root->addFrameListener(framelistener);
_root = new Ogre::Root("plugins_d.cfg");
if(!_root->showConfigDialog())
{
return -1;
}
Ogre::RenderWindow* window = _root->initialise(true,"Ogre3DBeginners Guide");
_sceneManager = _root->createSceneManager(Ogre::ST_GENERIC);
Ogre::Camera* camera = _sceneManager->createCamera("Camera");
camera->setPosition(Ogre::Vector3(0,0,50));
camera->lookAt(Ogre::Vector3(0,0,0));
camera->setNearClipDistance(5);
Ogre::Viewport* viewport = window->addViewport(camera);
viewport->setBackgroundColour(Ogre::ColourValue(0.0,0.0,0.0));
camera->setAspectRatio(Ogre::Real(viewport->getActualWidth())/Ogre::Real(viewport->getActualHeight()));
loadResources();
createScene();
_root->startRendering();
return 0;
}
void createScene()
{
Ogre::Entity* ent = _sceneManager->createEntity("Sinbad.mesh");
_sceneManager->getRootSceneNode()->attachObject(ent);
}
MyApplication()
{
_sceneManager = NULL;
_root = NULL;
}
~MyApplication()
{
delete _root;
}
};
int main (void)
{
MyApplication app;
app.startup();
return 0;
}
错误是ogre3d.exe 中的 0x51f7d0b1 处最可能的异常: 0xC0000005: 读取位置 0x000001ac 时发生访问冲突,
调试后好像是startup()函数这出错了,但不清楚到底是函数的哪个地方错了,请高人指教
------解决方案--------------------
访问野指针了?
------解决方案--------------------
_root 似乎为NULL了