2016-01-07 3 views
0

Используя visual studio 2013, я пытался запустить код ниже, но почему-то я получаю исключение «Куча повреждено», когда переменная vertexPointer достигает номер 7172. Иногда я получаю сообщение об ошибке: «igdusc32.pdb не загружен»Почему этот код генерирует ошибку: Heap был поврежден

Помогите мне пожалуйста!

#define VERTEX_COUNT 128 
#define TERRAIN_SIZE 800 

int count = VERTEX_COUNT * VERTEX_COUNT; 
    int size3 = count * 3; 
    int size2 = count * 2; 
    float* vertices = (float*)malloc(size3); 
    float* normals = (float*)malloc(size3); 
    float* uvs = (float*)malloc(size2); 

int vertexPointer = 0; 

for (int i = 0; i<VERTEX_COUNT; i++){ 
    for (int j = 0; j<VERTEX_COUNT; j++){ 

     vertices[vertexPointer*3] = (float)j/((float)VERTEX_COUNT - 1) * TERRAIN_SIZE; 
     vertices[(vertexPointer * 3) +1] = 0.0f; 
     vertices[(vertexPointer * 3) + 2] = (float)i/((float)VERTEX_COUNT - 1) * TERRAIN_SIZE; 

     normals[vertexPointer * 3] = 0.0; 
     normals[(vertexPointer * 3) +1] = 1.0f; 
     normals[(vertexPointer * 3) + 2] = 0.0f; 

     uvs[vertexPointer * 2] = (float)j/((float)VERTEX_COUNT - 1); 
     uvs[(vertexPointer * 2)+1] = (float)i/((float)VERTEX_COUNT - 1); 

     vertexPointer++; 
    } 
} 

ответ

3

Вы назначаете, например, vertices как size3байт, но вам необходимо выделить size3поплавки. Так изменится:

float* vertices = (float*)malloc(size3 * sizeof(float)); 
float* normals = (float*)malloc(size3 * sizeof(float)); 
float* uvs = (float*)malloc(size2 * sizeof(float)); 

Или, это существо C++, используйте new вместо:

auto vertices = new float[size3]; 
auto normals = new float[size3]; 
auto uvs = new float[size2]; 

(и ваш очистки затем придется менять на delete[] vertices, и т.д.).

Вы также можете использовать std::vector<float>, что еще более предпочтительно.

std::vector<float> vertices(size3); 
std::vector<float> normals(size3); 
std::vector<float> uvs(size2); 
Смежные вопросы