std :: vector Утверждение не выполнено (векторные итераторы несовместимы) - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть такая структура:

struct MxMInstanceData
{
    D3DXVECTOR2 mTransform;
    float mSpacing;
};

Затем я создаю вектор MxMInstanceData:

std::vector<MxMInstanceData> instInFrustumData;

Если я вызываю instInFrustumData.clear(), я получаю эту ошибку:

Утверждение не выполнено (векторные итераторы несовместимы)

Код создания вектора:

instInFrustumData.reserve(mNumInstances);

Код обновления вектора:

void Terrain::updateInstances()
{
    mNumInstancesInFrustum = 0;

    if(instInFrustumData.size() != 0)
        instInFrustumData.clear();

    mpMxMInstInFrustumB->Map(D3D10_MAP_WRITE_DISCARD, NULL, (void**) &instInFrustumData);

    for(int x = 0; x < mNumInstances; x++)
    {
        if(mpCamera->point2DInFrustum(instData[x].mTransform + 
            D3DXVECTOR2(instData[x].mSpacing/2 + mpCamera->getPosition().x, instData[x].mSpacing/2 + mpCamera->getPosition().z), instData[x].mSpacing/2)
            != OUTSIDE)
        {
            instInFrustumData.push_back(instData[x]);
            mNumInstancesInFrustum++;
        }
    }

    mpMxMInstInFrustumB->Unmap();
}

Что может сделать этослучается?

И в деструкторе моего класса я также называю clear ()

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Вы можете проверить ссылку на использование std::vector, как http://www.cplusplus.com/reference/stl/vector/ или купить хорошую книгу STL. Вы используете некоторые методы, которые я бы назвал неортодоксальными.

  • Используйте empty(), чтобы проверить, есть ли в векторе элементы (если не пустой, ясно, просто читается лучше)
  • По возможности используйте переменные локальной области видимости (вещи, которые не должны оставаться в области видимости, не должны)
  • Использовать итераторы STL или размеры контейнеров в циклах (нужны ли два инкрементных целых числа в одном цикле?)
  • Используйте «лучший» контейнер STL для своей реализации (хотите здесь векторы или карты?)
  • Избегайте приведения в стиле C и неправильного использования объектов ((void**) &instInFrustumData - очень плохая идея)

У вас так много переменных-членов, определение которых неизвестно, а также неизвестных методов Map() и UnMap(), и вы до сих пор не показали ни одного кода с использованием итераторов, связанных с вашей первоначальной ошибкой. Я предполагаю, что использование instData[x] опасно и проблематично, так же как и способ построения цикла в целом. Вы также действительно не хотите относиться к контейнерам STL как к чему-либо, кроме контейнеров STL. Следует избегать таких вещей, как (void**) &instInFrustumData, поскольку они могут вызвать только проблемы.

Я настоятельно рекомендую вам сначала изучить C ++, прежде чем приступить к работе с DirectX или графическими и игровыми движками, написанными на обоих.

2 голосов
/ 28 апреля 2011

Вид угадать здесь, но, возможно, ваша проблема в этой строке:

mpMxMInstInFrustumB->Map(D3D10_MAP_WRITE_DISCARD, NULL, (void**) &instInFrustumData);

Вы передаете указатель на сам вектор этой функции Map, которая, как я предполагаю, может перезаписывать некоторые из ее внутренних элементов? У меня нет документации, но она не похожа на функцию, которая ожидает указатель на вектор:)

...