2010-11-08 4 views
-3

Я создал этот класс для его загрузки, но я добавил эту новую функцию, чтобы ускорить загрузку. когда я вызываю функцию, моя программа прерывает/останавливает.
вот моя функцияC++ breaks on function function

bool CXFileEntity::LoadXFile(const std::string &filename, int startAnimation, CXFileEntity *entity, LPDIRECT3DDEVICE9 d3ddev) 
{ 
    // We only support one entity so if it already exists delete it 
    if (entity) 
    { 
     delete entity; 
     entity=0; 
    } 

    // Create the entity 
    entity=new CXFileEntity(d3ddev); 
    if (Load(filename)) 
    { 
     delete entity; 
     entity=0; 
     return false; 
    } 

    SetAnimationSet(startAnimation); 

    return true; 
} 
+0

Перерывы/остановки где? В этой функции? Другая функция? – dreamlax

+5

Вне темы: Что происходит, когда 'Load' выдает исключение? У вас есть «delete» в вашем коде, это плохо. Как я уже говорил, вам нужно ** остановиться ** и получить новизну, не ориентированную на игру книгу C++, и хорошо изучить C++ * first *. Кроме того, 'delete 0;' отлично, все выше '// Create the entity' должно быть заменено на' delete entity; entity = 0; '. (Хотя, опять же, его даже не должно быть, оно должно быть чем-то вроде 'entity.reset()', где 'entity' является умным указателем.) – GManNickG

+0

вам нужно дать больше информации. например, какие ошибки вы получаете, когда программа вылетает – thecoshman

ответ

1

EDIT: Подождите ... Я не понял, что эта функция является членом класс CXFileEntity. Это не похоже на статический метод. Поэтому, чтобы вызвать эту функцию, вам уже нужно создать экземпляр объекта CXFileEntity! Поэтому вполне вероятно, что вы абсолютно не хотите удалять или создавать объекты CXFileEntity внутри этого метода. (Если вы действительно позволяете только одному сущности существовать одновременно, вы фактически удаляете «это», а затем пытаетесь его воссоздать. Это не работает, никоим образом, нет.)

I оставив прежний ответ в надежде, что он все равно предоставит вам некоторое представление о том, как работают указатели.


Вы бы лучше дать больше информации, такие как где и как программных перерывов.

Но это явно не так:

CXFileEntity *entity, 

, потому что это означает, что новый объект выделено

entity=new CXFileEntity(d3ddev); 

не будет видно вызывающим. (Объект является локальной переменной, поэтому изменения в нем не будет видно за пределами локальной области видимости.)

Попробуйте изменить код, чтобы передать объект как указатель на указатель:

CXFileEntity **entity, 

, который будет означает изменение кода функции, чтобы соответствовать:

if (*entity) 
{ 
    delete *entity; 
    *entity=0; 
} 

// Create the entity 
*entity=new CXFileEntity(d3ddev); 

// etc. 

Вы также должны изменить звонящему передать указатель на указатель. И, к счастью, убедитесь, что при первом включении указателя он инициализируется 0:

CXFileEntity *the_entity = 0; 
...