0

デバッグのみのクラッシュが発生しています。私はEclipseのgdbを使用しています。私がそれを読んで失敗していない場合、インターフェイスメソッドにオブジェクトを(参照またはポインターではなく)渡すときにクラッシュが発生するようです。正確にmanytypedef 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;
};

そして、内部のクラッシュセクターinit(): Game3DWin(デバッグモードでビルドしていますが、ライブラリのデバッグバイナリをビルドしていないため、_DEBUG 定義はありません)

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() { }

windowOgre::RenderWindow*OGRE 3D オープン ソース レンダリング エンジンからのものです。デストラクタなどを呼び出そうとした場合に備えて、(int)プッシュする前にキャストしようとしましたが、それでも同じクラッシュが発生しました。many

4

2 に答える 2

0

これは拡張コメントであり、コメントに収めるには長すぎます。

Message実装されたコンストラクタとデストラクタがありません。問題がまだ発生していることを確認しながらクラスを単純化するか、その実装を公開します。

window不明なタイプの変数です。listクラッシュにboost::anyはタイプが含まれていると報告しているのでwindow、それが何であるかを知ることは、いくらか役立つかもしれません。

this->broadcaster.lock()がなくなったshared_ptr場合はnullになります。weak_ptr常に、常に、常に、それが有効であることを確認した後(または任意の名前)をshared_ptr<foo> pFoo = this->broadcaster.lock();使用します( eanコンテキストで評価します)。pFoobool

boost::weak_ptr<CRengine::Messageable> caster-これが存在するかどうかわかりませんか?boost::shared_ptrGame3DWinの作成中にキャスターが少なくとも存在することがわかるように、ここが必要になる可能性があります。

ここでも同じです: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 に答える