проблема резервирования массива c ++ - PullRequest
0 голосов
/ 21 февраля 2011

У меня проблема при резервировании массива. Проблема в куче ошибок. Программное обеспечение, которое я делаю, выглядит так:

Я создаю небольшое программное обеспечение для рендеринга модели определенного формата. модель содержит несколько групп, и каждая группа содержит вершины массива и массив индексов для этих вершин », например модель мотоцикла из 3 групп: переднее колесо, заднее колесо и кузов. После загрузки модели в память я хочу отобразить ее как VBO, но модель состоит из нескольких групп, как уже упоминалось, поэтому я объединяю все вершины во всех группах в один массив вершин, и то же самое касается индексов. При объединении ошибки кучи возникает при резервировании массива. это:

    int index=0;
    for(int i=0;i<this->groupsSize;i++)
        index+=this->groups[i]->capacity.vertsSize;
    mdl_vert *m_pVertices=new mdl_vert[index];
    index=0;
    for(int i=0;i<this->groupsSize;i++)
        index+=this->groups[i]->capacity.indicesSize;
    unsigned int *m_pIndices=new unsigned int[index];
    index=0;
    for(int i=0;i<this->groupsSize;i++)
    {
        for(int j=0;j<this->groups[i]->capacity.vertsSize;j++)
        {
            m_pVertices[index]=this->groups[i]->verts[j];
            index++;
        }
    }

Когда я резервирую индексы, возникает ошибка кучи. Я также использовал std :: vector, но возникает та же ошибка. Кто-нибудь может дать мне подсказку о том, что я делаю неправильно в этом случае.

N.B. mdl_vert - это структура, которая состоит из чисел с плавающей запятой x, y, z; вызывается при резервировании массива.

Ответы [ 4 ]

2 голосов
/ 21 февраля 2011

Вы не предоставляете достаточно информации для точного определения проблемы или даже в чем проблема.

Но есть вещи, которые вы можете сделать, чтобы очистить код, и, возможно, это поможет.


1. Использовать std :: vector вместо `new` -ing raw-массивов

Вместо

unsigned int *m_pIndices=new unsigned int[index];

использовать

std::vector<unsigned> indices( index );

Примечаниечто этот std::vector сам по себе не выделяется динамически.

Он использует динамическое распределение внутри, и делает это правильно для вас.

Еще лучше, просто используйте…

std::vector<int> indices( index );

… потому что беззнаковая арифметика может легко испортить.

2. Не используйте вводящее в заблуждение наименование

Префикс m_ создает впечатление, что вы действительно хотите получить доступ к элементам данных, а нелокальные переменные.

Но вы определяете локальные переменные.

Либо используйте члены данных, либо удалите префиксы m_ name.

3. Не используйте повторно"Переменные

Вы используете переменную index для нескольких последовательных целей.

Объявите и используйте одну(правильно названная) переменная для каждой цели.

4. Не полагайтесь на побочные эффекты от более раннего кода.

Например, вы полагаетесь на значение index послеfor -loop, где используется счетчик цикла.

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

5. Не затеняйте код до-ничего.

Это просто проблема стиля, но рассмотрите возможность удаления всех квалификаций this->.Это многословно и затемняет код;это делает код менее читабельным и менее понятным.Да, с такими примитивными инструментами, как Visual Studio, такие квалификации могут помочь в получении имен в выпадающих списках, но это плохая услуга: усложняет запоминание, а без запоминания не может быть понимания, необходимого для правильной записи.код.


Приветствия и hth.,

1 голос
/ 21 февраля 2011

Насколько велик полученный индекс?Возможно, просто переполнение происходит.

1 голос
/ 21 февраля 2011

Знаете ли вы, что это за ошибка?Если нет, вы можете попробовать поместить код в try / catch с std :: exception.Обычно, когда я получал ошибки в том же духе, это было связано с ошибкой st9bad_alloc.Что по существу означает, что размер, предоставленный новому, был недопустим или слишком велик (или в терминах или в фактической памяти, или из-за ограничений, наложенных системой в отношении стека)Если это так, проверьте числа, введенные в new, и убедитесь, что размер стека достаточно большой (попробуйте команду 'limit' при использовании Linux).Удачи

0 голосов
/ 21 февраля 2011

Один или несколько из ваших мощностей. Печать индекса перед выделением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...