Динамическое выделение массива в цикле for вызывает ошибку - PullRequest
2 голосов
/ 26 февраля 2012

У меня есть это для цикла:

for(int l = 0; l < level_max; ++l) {
    //...
    indexCount[l] = (2*patch_size_level+1) * (patch_size_level - 1);
    GLuint* indices = new GLuint[indexCount[l]];
    //... (for loops in which I fill indices)
    delete[] indices;
}

(фрагмент полного кода можно найти здесь: https://gist.github.com/1915777)

По какой-то причине это выдает следующее исключение памяти в GLuint* indices = new GLuint[indexCount[l]];

Демонстрация (12783,0x7fff7367e960) malloc: * ошибка для объекта 0x1028cd408: неверная контрольная сумма для освобожденного объекта - объект, вероятно, был изменен после освобождения.

Что я делаю не так? Я не назначаю больше чем indexCount[l] значений для моего массива индексов. (Я проверял это). Как правильно удалить динамический массив в цикле, как это.

Спасибо

Ответы [ 4 ]

1 голос
/ 26 февраля 2012

Возможно не связано, но в этой строке возможно переполнение буфера чтения:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GL_UNSIGNED_INT) * indexCount[l], indices, GL_STATIC_DRAW);

Я не знаю, как sizeof(GL_UNSIGNED_INT) сравнивается с sizeof(GLuint) в вашей системе, но проверьте ваш коддля такого рода ошибок.

0 голосов
/ 26 февраля 2012

Проблемы были устранены. Это был предыдущий вызов new[] (в другом методе), который не имел надлежащего размера, что вызывало проблему здесь.Большое спасибо за вашу помощь, ребята!

0 голосов
/ 26 февраля 2012

Добавление строки std::cout << current_index << " " << (2*patch_size_level+1) * (patch_size_level - 1) << std::endl; приводит к следующему выводу:

Где вы добавили эту строку?IME current_index достигает 8126 до сбоя, indexCount[l], как в вашем случае, 2144. Вот что у нас есть:

patch_size=64
level_max=5
patch_size_level=33
indexCount[0]=2144

, но вы выполняете внутренний цикл (patch_size * (patch_size-1)) раз, что составляет 4032, и вы два приращения current_index за внутренний цикл, что дает нам более 8000.

Возможно, вы в какой-то момент перепутали patch_size и patch_size_level, но я не уверен.

0 голосов
/ 26 февраля 2012

Так как он вызывает исключение памяти в следующей строке:

GLuint* indices = new GLuint[indexCount[l]];

есть две (связанные с памятью) вещи, которые, как я вижу, могут пойти не так:

  1. Запрещен доступ в indexCount. Вы уверены, что выделили место для indexCount? Вы уверены, что он имеет размер больше l, когда выбрасывает это исключение? Попробуйте отладку и проверку, чтобы убедиться, что indexCount не равен нулю и что l не больше, чем размер indexCount, перед тем как сгенерировано исключение. Посмотрите, будет ли он в первой итерации цикла for или в средней итерации.

  2. C ++ new не может выделить достаточно памяти. Это единственная ошибка, связанная с памятью, которую я вижу по этой строке кода. Тем не менее, я не вижу, чтобы сообщение об ошибке могло быть связано с нехваткой памяти для выделения, поэтому я сомневаюсь, что именно это.

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

  • Значение indexCount равно нулю при обращении к нему (при возникновении исключения)
  • Создает ли исключение первое значение или промежуточное значение цикла for
  • Действительно ли исключение генерируется в этой конкретной строке?
  • Проверьте размер indexCount и место его размещения и убедитесь, что l не больше этого размера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...