2016-05-24 3 views
0

У меня вопрос, который довольно общий, но я надеюсь, что кто-то сможет хотя бы указать мне в правильном направлении.C++ Visual Studio Release build unused crash

Я создал свой проект, я строил его только в режиме отладки с флагом/MDd. Но у него начались проблемы с производительностью, поэтому я хотел попробовать его в режиме Release, чтобы посмотреть, как это происходит. Проблема заключается в том, что когда я использую флаг/MD или/MT и режим Release, мое приложение мгновенно вылетает. Итак, я попытался выяснить, почему. Он отлично работает в Debug. Я пробовал некоторые изменения кода, но ничего не помогло. Поэтому я решил сделать свое приложение только началом и прокомментировать остальную часть моего кода. Но он все еще падал. Даже когда мой код не использовался. Это не сбой только, когда я полностью удалил неиспользуемые части кода.

Я думаю, что это что-то с переменной inicialization/declaration, но я не совсем уверен, что мне следует искать.

Может ли кто-нибудь предложить мне, что может привести к сбою приложения, даже если это просто объявление/inicialization и даже не используется в RunTime?

Надеюсь, вы сможете как-то понять, в чем моя проблема.

Спасибо за любые предложения!

EDIT: код, который выходит из строя, когда неиспользуемый код находится в проекте, но не сбой при удалении неиспользуемого кода.

#include "core/oxygine.h" 
#include "Stage.h" 
#include "DebugActor.h" 

//#include "Galatex.h" 


using namespace oxygine; 


//called each frame 
int mainloop() 
{ 
    //galatex_update(); 
    //update our stage 
    //update all actors. Actor::update would be called also for all children 
    getStage()->update(); 

    if (core::beginRendering()) 
    { 
     Color clearColor(32, 32, 32, 255); 
     Rect viewport(Point(0, 0), core::getDisplaySize()); 
     //render all actors. Actor::render would be called also for all children 
     getStage()->render(clearColor, viewport); 

     core::swapDisplayBuffers(); 
    } 

    //update internal components 
    //all input events would be passed to Stage::instance.handleEvent 
    //if done is true then User requests quit from app. 
    bool done = core::update(); 

    return done ? 1 : 0; 
} 

//it is application entry point 
void run() 
{ 
    ObjectBase::__startTracingLeaks(); 

    //initialize Oxygine's internal stuff 
    core::init_desc desc; 

#if OXYGINE_SDL || OXYGINE_EMSCRIPTEN 
    //we could setup initial window size on SDL builds 
    desc.w = 1800; 
    desc.h = 1000; 
    //marmalade settings could be changed from emulator's menu 
#endif 


    //galatex_preinit(); 
    core::init(&desc); 


    //create Stage. Stage is a root node 
    Stage::instance = new Stage(true); 
    Point size = core::getDisplaySize(); 
    getStage()->setSize(size); 

    //DebugActor is a helper actor node. It shows FPS, memory usage and other useful stuff 
    DebugActor::show(); 

    //initialize this example stuff. see example.cpp 
    //galatex_init(); 

#ifdef EMSCRIPTEN 
    /* 
    if you build for Emscripten mainloop would be called automatically outside. 
    see emscripten_set_main_loop below 
    */ 
    return; 
#endif 


    //here is main game loop 
    while (1) 
    { 
     int done = mainloop(); 
     if (done) 
      break; 
    } 
    //user wants to leave application... 

    //lets dump all created objects into log 
    //all created and not freed resources would be displayed 
    ObjectBase::dumpCreatedObjects(); 

    //lets cleanup everything right now and call ObjectBase::dumpObjects() again 
    //we need to free all allocated resources and delete all created actors 
    //all actors/sprites are smart pointer objects and actually you don't need it remove them by hands 
    //but now we want delete it by hands 

    //check example.cpp 
    //galatex_destroy(); 


    //renderer.cleanup(); 

    /**releases all internal components and Stage*/ 
    core::release(); 

    //dump list should be empty now 
    //we deleted everything and could be sure that there aren't any memory leaks 
    ObjectBase::dumpCreatedObjects(); 
    ObjectBase::__stopTracingLeaks(); 
    //end 
} 

#ifdef __S3E__ 
int main(int argc, char* argv[]) 
{ 
    run(); 
    return 0; 
} 
#endif 


#ifdef OXYGINE_SDL 

#include "SDL_main.h" 
extern "C" 
{ 
    int main(int argc, char* argv[]) 
    { 
     run(); 
     return 0; 
    } 
}; 
#endif 

#ifdef EMSCRIPTEN 
#include <emscripten.h> 

void one() { mainloop(); } 

int main(int argc, char* argv[]) 
{ 
    run(); 
    emscripten_set_main_loop(one, 0, 0); 
    return 0; 
} 
#endif 
+1

Вам необходимо опубликовать код (вы утверждаете, что у вас есть минимальный пример, который выходит из строя). – SergeyA

+0

Если вы создаете свой проект из шаблона в VS, тогда вам не нужно беспокоиться обо всех этих коммутаторах. Вы выбираете Debug или Release. Я предлагаю вам создать новый проект и скопировать весь код на него. – marcinj

+0

Я добавил код, который сбой с неиспользуемым кодом, но это нормально, когда я удаляю неиспользуемый код полностью из проекта. Но я не думаю, что это поможет с anyhing. –

ответ

0

Так что я напишу его здесь, возможно, для других новичков, подобных мне, которые окажутся в подобном общении.

Моя проблема была в инициализации статических и других переменных, которые были «вне функции». Например:

MyObject object = new MyObject(); //This was the reason, why it was crashing, just had to move 
             // initialization of such variables to function which was called with object creation.     
    void MyClass::myFunction(){ 

     object->doSomething();  
    } 

Поэтому, когда программа начала инициализацию этих переменных, произошел сбой программы. Примечание: Кажется, что это была проблема с объектами, причиной таких переменных, как целые или такие, было просто отлично.

Ну, я не совсем уверен, почему это разрешено в режиме отладки, но сработает режим выпуска сразу после запуска, может быть, кто-то может ответить под этим комментарием и объяснить это поведение, я просто начинаю, и я делаю много плохих вещей, но я стараюсь, и это хорошо, не так ли? : D

Надеюсь, я не тратил слишком много времени на ваших парней, и, возможно, этот пост будет полезен кому-то в будущем.

Смежные вопросы