c ++ разрывается на функции класса - PullRequest
0 голосов
/ 09 ноября 2010

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

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;
}

1 Ответ

1 голос
/ 09 ноября 2010

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

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


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

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

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;
...
...