2016-10-11 5 views
0

텍스처를 초기화하려고합니다 (OpenGL에서). glTexSubImage2D에 전송 된 블록이 malloc에 ​​할당되면 초기화가 잘 수행됩니다. aligned_alloc을 사용하면 대부분의 경우 segfault가 발생합니다. 왜 ?aligned_alloc 및 glTexSubImage2D로 인해 세그먼트 화 오류가 발생합니다.

GLuint texture_id; 
GLenum err; 

int sx = 2048; 
int sy = 1024; 
char *data = (char *)aligned_alloc(sizeof(char)*sx*sy*3, ALIGN_VALUE); 
//char *data = (char *)malloc(sizeof(char)*sx*sy*3); 

glGenTextures(1, &texture_id); 
glActiveTexture(texture_unit); 
glBindTexture(GL_TEXTURE_2D, texture_id); 
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, sx, sy); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, sx, sy, GL_BGR, GL_UNSIGNED_BYTE, data); 

Valgrind의이 aligned_alloc와 많은 오류를 나열

코드의 최소한의 조각 문제를 재현합니다. aligned_alloc 호출의 위치에서 memalign에 두 개 (처음 것처럼). glTexSubImage2D 명령의 위치에있는 다른 모든 것 (두 번째 것과 비슷 함).

==7042== Invalid read of size 1 
==7042== at 0x4045F71: ??? (in /tmp/.glamhkos (deleted)) 
==7042== by 0xCFFFFFF: ??? 
==7042== by 0xD68A04F: ??? 
==7042== by 0xFFEFFFE3F: ??? 
==7042== Address 0xd000002 is 0 bytes after a block of size 2 alloc'd 
==7042== at 0x4C2B1B6: memalign (vg_replace_malloc.c:760) 
... 
==7042== by 0x4016E1: main (in /.../) 


==7042== Invalid read of size 1 
==7042== at 0x4045F71: ??? (in /tmp/.glamhkos (deleted)) 
==7042== by 0xD0017FF: ??? 
==7042== by 0xD68C04F: ??? 
==7042== by 0xFFEFFFE3F: ??? 
==7042== by 0x1: ??? 
==7042== by 0x7B23325: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79) 
==7042== by 0x7B2D9A6: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79) 
==7042== by 0x7C7DD40: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79) 
==7042== by 0x7C51383: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79) 
==7042== by 0x7C52A16: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79) 
==7042== by 0x7C6F553: ??? (in /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.352.79) 
... 
==7042== Address 0xd001802 is 6,146 bytes inside a block of size 6,852,752 in arena "client" 

ALIGN_VALUE를 변경해도 도움이되지 않습니다.

malloc을 사용할 때 Valgrind가 오류를 나열하지 않습니다.

답변

0

최소 예제에서 aligned_alloc (sizeof (char) sx sy * 3, ALIGN_VALUE)을 잘못 사용합니다. 매개 변수가 잘못되었습니다.

대신 사용 : aligned_alloc (ALIGN_VALUE,는 sizeof (문자) SX SY * 3)

관련 문제