2011-07-30 53 views
2

我想屏幕刮從已經在OpenGL渲染了供過於求的窗口形象。在顯示回調方面,我插入了以下代碼:的OpenGL與GLUT--的malloc錯誤

display() { 
     drawTriangle(); //Renders the image 
     if(shouldDisplay) { 
      shouldDisplay=0; 
      bytes = width*height*3; //Color space is RGB 
      buffer = (GLubyte *)malloc(bytes); //buffer is global var for now 
       glFinish(); 
      glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer); 

     } 
     glutSwapBuffers(); 
    } 

此代碼運行後,malloc啓動失敗。它與ENOMEM失敗,錯誤12.我不知道操作系統或GLUT足夠了解爲什麼會發生這種情況。我只是試圖在3 GB的機器上分配17K。我正在使用Windows XP和Visual Studio C++ 2010 Express。任何幫助或建議表示讚賞。

+0

什麼類型的寬度,高度和字節,多少次是代碼的運行,並且你的地方釋放內存? – ergosys

+2

好的..沒有免費()在視線:) – nielsj

回答

2

這段代碼在最後沒有輸入free(buffer),所以每次重繪都會消耗越來越多的內存,直到進程耗盡內存和/或地址空間(稍後僅在32位系統上,因爲64位地址在合理的時間內分配空間不會很大)。

+0

我發現在與朋友的調試會話中缺少空閒緩衝區。這是我所描述的問題。感謝您看到它,我很抱歉發佈這樣的骨頭錯誤。 – ahoffer

1

讓我重新整理這半豎起的答案。我認爲堆被丟棄了,可能是丟失了 free()和glReadPixels覆蓋你的目標緩衝區的連續分配。

大多數的幀緩衝區是至少32位/雙字對齊的,這表明,作爲註釋,在這裏說,W * H * 4個字節可能只是工作,因爲它的內部表示匹配。

對齊設置爲1個字節(像另一個回答說)似乎也沒關係我。

1

調用glReadPixels之前嘗試glPixelStorei(GL_PACK_ALIGNMENT, 1);