Ошибка времени выполнения: нарушение прав доступа при использовании .push_back () с std :: vector? - PullRequest
3 голосов
/ 26 ноября 2009

У меня есть вектор, определенный как std::vector<LPDIRECT3DTEXTURE9> textures; Позже я передаю ему объект LPDIRECT3DTEXTURE9, например, textures.push_back(texture); Вот пример этого:

void SpriteManager::AddSprite(float x, float y, float z, LPDIRECT3DTEXTURE9 texture)
{
    //snip
    textures.push_back(texture);
    //snip
}

Это вызывает ошибку во время выполнения. Это разрыв в векторном классе при функции size(). Почему это может случиться?

Edit:

Я также столкнулся с идентичной проблемой, выполняя ту же самую операцию с вектором D3DXVECTOR3 объектов. Поскольку LPDIRECT3DTEXTURE9 является указателем на IDIRECT3DTEXTURE9, я должен использовать это вместо этого?

Ответы [ 3 ]

1 голос
/ 26 ноября 2009

Ваш вектор был поврежден. Я бы посоветовал поместить точку наблюдения за данными на ее внутренности, чтобы увидеть, что на нее давит (в отладчике).

1 голос
/ 26 ноября 2009

Что ж, поскольку LPDIRECT3DTEXTURE9 по его венгерскому имени является указателем, а не объектом (как вы на него ссылаетесь), я предполагаю, что вы передаете недопустимые указатели, которые уже сделали fandango на вашем плохой векторный объект перед вызовом push_back ().

Возможно, я ошибаюсь, но об этом можно судить по предоставленной вами информации. И, да, push_back () должен быть в состоянии потерпеть неудачу только в том случае, если у вас недостаточно памяти или вы пытаетесь использовать объект, который нельзя скопировать или не назначить, в векторе, а затем не из-за нарушения прав доступа.

0 голосов
/ 27 ноября 2009

Наиболее распространенная причина в том, что у вас на самом деле нет вектора. В этом случае textures представляется членом класса SpriteManager. Итак, это говорит о том, что у вас на самом деле нет SpriteManager объекта. Указатель this действителен?

...