2011-07-08 41 views
0

在下面的代碼我得到一個錯誤:錯誤消息:*** glibc的檢測*** ./cube:(!上一頁)雙重釋放或腐敗:0x0a4c4420 ***

333   glGenBuffers(surftotal, uiVBO); 
334   { 
335     for(surfnum=0; surfnum<surftotal; ++surfnum) 
336     { 
337       glBindBuffer(GL_ARRAY_BUFFER, uiVBO[surfnum]); 
338       size_t buf_size = 9*sizeof(GLfloat)*triNum[surfnum]; 
339       GLfloat* const pData = (GLfloat*)malloc(buf_size); 
340       for(i=0; i<triNum[surfnum]; ++i) 
341         printf("%d...",triNum[surfnum]); 
342         { 
343         memcpy(pData+i*9, triArray[surfnum][i].pt1, 3*sizeof(GLfloat)); 
344         memcpy(pData+i*9+3, triArray[surfnum][i].pt2, 3*sizeof(GLfloat)); 
345         memcpy(pData+i*9+6, triArray[surfnum][i].pt3, 3*sizeof(GLfloat)); 
346         } 
347         glBufferData(GL_ARRAY_BUFFER, buf_size, pData, GL_STATIC_DRAW); 
348         free(pData); 
349     } 
350     glBindBuffer(GL_ARRAY_BUFFER, 0); 
351     glEnableVertexAttribArray(VERTEX_ARRAY); 
352     for(surfnum=0; surfnum<surftotal; ++surfnum) 
353     { 
354       glBindBuffer(GL_ARRAY_BUFFER, uiVBO[surfnum]); 
355       glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, 0, 0); 
356       glDrawArrays(GL_TRIANGLES, 0, 3*triNum[surfnum]); 
357       if (!TestEGLError("glDrawArrays")) 
358       { 
359       goto cleanup; 
360       } 
361     } 
362     glBindBuffer(GL_ARRAY_BUFFER, 0); 
363     eglSwapBuffers(eglDisplay, eglSurface); 
364 
365     if (!TestEGLError("eglSwapBuffers")) 
366     { 
367       goto cleanup; 
368     } 
369 
370     int i32NumMessages = XPending(x11Display); 
371     for(int i = 0; i < i32NumMessages; i++) 
372     { 
373       XEvent event; 
374       XNextEvent(x11Display, &event); 
375     } 
376   } 
377   glDeleteBuffers(surftotal,uiVBO); 

而錯誤是:

* glibc detected ./cube: free(): invalid pointer: 0x090c53a0 **

printf越來越錯誤,並將其寫入7 7 7 7 7 7 7 1 aborted然後這個錯誤。

當我嘗試打印時出現此錯誤。我嘗試用valgrind,其輸出是:

==8922== Memcheck, a memory error detector 
==8922== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. 
==8922== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info 
==8922== Command: ./cube 
==8922== 
libEGL warning: use software fallback 
==8922== Invalid write of size 1 
==8922== at 0x4027418: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A48F: main (Hello.cpp:343) 
==8922== Address 0x9391567 is 11 bytes after a block of size 252 alloc'd 
==8922== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==8922== by 0x804A3EC: main (Hello.cpp:339) 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027420: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A48F: main (Hello.cpp:343) 
==8922== Address 0x9391566 is 10 bytes after a block of size 252 alloc'd 
==8922== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==8922== by 0x804A3EC: main (Hello.cpp:339) 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027429: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A48F: main (Hello.cpp:343) 
==8922== Address 0x9391565 is 9 bytes after a block of size 252 alloc'd 
==8922== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==8922== by 0x804A3EC: main (Hello.cpp:339) 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027432: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A48F: main (Hello.cpp:343) 
==8922== Address 0x9391564 is 8 bytes after a block of size 252 alloc'd 
==8922== at 0x4025BD3: malloc (vg_replace_malloc.c:236) 
==8922== by 0x804A3EC: main (Hello.cpp:339) 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027418: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A4E3: main (Hello.cpp:344) 
==8922== Address 0x9391573 is not stack'd, malloc'd or (recently) free'd 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027420: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A4E3: main (Hello.cpp:344) 
==8922== Address 0x9391572 is not stack'd, malloc'd or (recently) free'd 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027429: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A4E3: main (Hello.cpp:344) 
==8922== Address 0x9391571 is not stack'd, malloc'd or (recently) free'd 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027432: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A4E3: main (Hello.cpp:344) 
==8922== Address 0x9391570 is not stack'd, malloc'd or (recently) free'd 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027418: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A539: main (Hello.cpp:345) 
==8922== Address 0x939157f is not stack'd, malloc'd or (recently) free'd 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027420: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A539: main (Hello.cpp:345) 
==8922== Address 0x939157e is not stack'd, malloc'd or (recently) free'd 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027429: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A539: main (Hello.cpp:345) 
==8922== Address 0x939157d is not stack'd, malloc'd or (recently) free'd 
==8922== 
==8922== Invalid write of size 1 
==8922== at 0x4027432: memcpy (mc_replace_strmem.c:497) 
==8922== by 0x804A539: main (Hello.cpp:345) 
==8922== Address 0x939157c is not stack'd, malloc'd or (recently) free'd 
==8922== 
--8922-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting 
--8922-- si_code=1; Faulting address: 0xC8B91574; sp: 0x62a5ce00 

valgrind: the 'impossible' happened: 
    Killed by fatal signal 
==8922== at 0x38031511: unlinkBlock (m_mallocfree.c:245) 

sched status: 
    running_tid=1 

Thread 1: status = VgTs_Runnable 
==8922== at 0x4024F12: calloc (vg_replace_malloc.c:467) 
==8922== by 0x48D068A: softpipe_resource_create (sp_texture.c:114) 
==8922== by 0x4A50D96: st_bufferobj_data (u_inlines.h:180) 
==8922== by 0x4A1BB4E: _mesa_BufferDataARB (bufferobj.c:1177) 
==8922== by 0x49BFFD7: _es_BufferData (api_exec_es2.c:391) 
==8922== by 0x804A561: main (Hello.cpp:347) 

但我無法理解。你能告訴我錯誤在哪裏嗎? 如果我使用

export MALLOC_CHECK_=0

這給出了分段錯誤。

(我編輯的問題)

+0

您似乎錯過了行號信息,請嘗試使用完全調試進行重建。 –

+0

你是什麼意思是什麼所有這個valgrind命令「valgrind --leak-check = yes ./cube」給我粘貼它.. –

+0

@surbhi:弗蘭克意味着你應該通過'-g'選項到你的編譯器(GCC? )編譯和鏈接時,「cube」可執行文件嵌入了調試信息。然後,Valgrind可以打印錯誤發生在哪行代碼中(因爲它已經用'memcpy'和'malloc'完成了)。 – DarkDust

回答

6
for(i=0; i<triNum[surfnum]; ++i) 
    printf("%d...",triNum[surfnum]); 
    { 
    memcpy(pData+i*9, triArray[surfnum][i].pt1, 3*sizeof(GLfloat)); 
    memcpy(pData+i*9+3, triArray[surfnum][i].pt2, 3*sizeof(GLfloat)); 
    memcpy(pData+i*9+6, triArray[surfnum][i].pt3, 3*sizeof(GLfloat)); 
    } 

你這裏的支柱安置問題。只有printf位於循環內部,結果,memcpy行將只運行一次,其值爲i太大。

這會覆蓋緩衝區邊界之外的內存,這會導致出現內存損壞錯誤。

相關問題