0

我只有调试崩溃。我正在使用 Eclipse 的 gdb。如果我没有阅读失败,那么在将对象(不是通过引用或指针)传递给接口方法时似乎会发生崩溃,恰好是在调用复制构造函数期间复制“ many”(typedef std::list<boost::any> many;)成员以将副本发送到方法。我没有使用调试构建来提升,也没有使用其他外部构建,只是为了我正在编译的代码,那么,这可能是原因吗?关于可能是什么原因的任何其他想法?

class Message {
public:
static const int MAX_LEVEL=5;
Message(int type=0, int destination=0);
virtual ~Message();

int type;
int destination[MAX_LEVEL];
int level;
many message;
};

还有崩溃的扇区,里面:(即使我在调试模式下构建,也没有 _DEBUG 定义,因为我没有为库构建调试二进制文件init()Game3DWin

bool Game3DWin::init(){
#ifdef _DEBUG
pluginsCfg = "lib/plugins_d.cfg";
resourcesCfg = "res/resources_d.cfg";
#elif OGRE_PLATFORM == OGRE_PLATFORM_WIN32
pluginsCfg = "lib/pluginsWin.cfg";
resourcesCfg = "res/resources.cfg";
#else
pluginsCfg = "lib/plugins.cfg";
resourcesCfg = "res/resources.cfg";
#endif
ogreRoot=boost::make_shared<Ogre::Root>(pluginsCfg, "config.cfg");
if(!(ogreRoot->restoreConfig() || ogreRoot->showConfigDialog())){
    return false;
}
window = ogreRoot->initialise(true, "Crewon CLASH!");
loadResourceCfgFile();

guiRenderer = &CEGUI::OgreRenderer::bootstrapSystem();
CEGUI::SchemeManager::getSingleton().create( "TaharezLook.scheme" );
CEGUI::System::getSingleton().setDefaultFont( "DejaVuSans-10" );
CEGUI::System::getSingleton().setDefaultMouseCursor( "TaharezLook", "MouseArrow" );
CEGUI::Window* myRoot = CEGUI::WindowManager::getSingleton().createWindow( "DefaultWindow", "_MasterRoot" );
CEGUI::System::getSingleton().setGUISheet( myRoot );

    CRengine::Message msg=CRengine::Message( (int)CRengine::MESSAGE_TYPE::INPUT_INIT );
msg.message.push_front(window);
this->broadcaster.lock()->receiveMessage( msg ); //Crash here
//Unreached code due to crash
}

broadcaster 是一个指向 Messageable 的指针,一个接口。

class Messageable {
public:
virtual ~Messageable() {};
virtual bool receiveMessage(CRengine::Message) = 0;
};

广播器初始化(能够存储“this”智能指针的工厂方法):

Game3DWin* Game3DWin::create(boost::shared_ptr<CRengine::Messageable> caster, int processType, int order){
Game3DWin* temp= new Game3DWin(processType, order);
temp->broadcaster=caster;
bool success=temp->init();
if(!success){
    delete temp;
    temp=NULL;
}else{
    temp->checkRoom(); }
return temp;
}

上面的代码在这里调用:

bool MainManager::start( boost::shared_ptr<MainManager> thisMM ){
//Some code
    boost::shared_ptr<Game3DWin> win;
    win.reset( Game3DWin::create(thisMM, CRengine::MAIN_PROCESS_TYPES::PROCESS_GUI) );
//Some code
}

从 main 调用 start(),它将指针传递给 MainManager

boost::shared_ptr<CRengine::MainManager> app =boost::make_shared<CRengine::MainManager>();
        app->start(app);

消息实现:

Message::Message(int type, int destination): type(type), level(0){
for(int ii=0;ii<MAX_LEVEL;ii++){
     this->destination[ii]=-1;
}
this->destination[0]=destination;
}
Message::~Message() { }

window来自Ogre::RenderWindow*OGRE 3D开源渲染引擎。我试图在将其(int)推入之前将其强制转换many,以防它试图调用析构函数或其他东西,但仍然是同样的崩溃。

4

2 回答 2

0

这是一个扩展评论,太长了,无法放入评论中。

Message缺少实现的构造函数和析构函数。在确认问题仍然存在的同时简化类,或者向我们公开该实现。

window是一个未知类型的变量。由于您报告的崩溃包含该list类型,因此知道它是什么可能有点用处。boost::anywindow

this->broadcaster.lock()shared_ptr如果weak_ptr已经消失,将为空。总是,总是,总是在检查它是否有效(在ean 上下文中评估它)之后shared_ptr<foo> pFoo = this->broadcaster.lock();使用(或任何名称)。pFoobool

boost::weak_ptr<CRengine::Messageable> caster——你不知道这是否存在?您可能想要一个boost::shared_ptr在这里,以便在创建 Game3DWin 期间至少知道施法者存在。

这里也一样:boost::weak_ptr<MainManager> thisMM-- 可能应该是shared_ptr.

于 2012-11-09T02:10:38.300 回答
0

问题不是上述任何一个。这是由于 Eclipse 无法清理造成的。这是由于使用“外部生成器”mingw32-make.exe 造成的,它在 makefile 中运行了一个del <Filelist>并且 Windows7 似乎对此及其参数有一些问题,所以clean什么也没做。由于我使用的Debug是主动构建,因此由于缺少 ,我遇到了崩溃clean,但是当我切换到Release它时,它并没有受到影响,因为它必须主要重建所有东西。手动删除内容<project>/Debug<project>/Release修复问题。

于 2012-11-09T03:47:35.550 回答