2010-01-24 4 views
2

나는 아주 이상한 문제가 있습니다. 내 수업은 단체 중에서 기타 = 다음 memers있다 : 나는구성원 변수를 변경할 때 힙 손상이 발생합니다.

를 얻을 수 (LOCATION2)에서 has_alpha를 넣어 경우

GLboolean has_alpha; 
GLuint width; 
GLuint height; 
GLuint length; 
GLuint millisPerFrame; 
GLfloat uv[2]; 
GLuint texsize[2]; 
GLint compsize; 
    // location2 
long preload_interval_next; 
long preload_interval; 

을 다른 개체의 크기는 sizeof 연산자는 248 대신 252 바이트

을보고하는)

b) 무거운 힙 손상

GLboolean 부호는 문자로 정의되지만 내가 모두 012 없음 최적화를 사용하지 않기 때문에(double을 선택) 4 바이트로 채워야합니다. 테스트 그리고 그것은 웁니다 경우 결국,이 두 위치에 그것을해야 ...

컴파일러 : 꽝 (C++), GCC4.2의 com.apple.compilers.llvmgcc42

사람은 어떻게 생각 추적 해?

+0

게시 한 내용에 근거한 명백한 문제는 없습니다. 모든 구성원이 왜 252에서 248으로 전환되는지 보려면 구성원을 확인해야합니다. –

+3

클래스를 사용하는 모든 개체를 다시 컴파일 했습니까? – ephemient

+0

@ephemient - lol, 가장 분명한 해결책을 생각하지 못했습니다 : D –

답변

2

여기에 나와있는 문제는 회원 목록에있는 것이 아닙니다. bu 다른 하나, 가능하게는 int, 포인터 또는 이 이 생성자에서 제대로 초기화되지 않았습니다. 실패한 큰 예제를 게시하고 생성자 초기화 목록을 사용하여 모든 멤버를 초기화해야합니다.

+0

문제는 실제로 어딘가에서 파생 된 기본 클래스 – user257620

2

내가 게시 한 코드에 문제가 있는지 의심 스럽습니다. 나머지 반은 우리에게 보여줘야 해. 그러나 몇 가지 힌트 :

A)이 구조의 포인터를 전달하는 경우 발생할 수 있습니다)에 대한 data alignment)

B를 읽어 인해 정렬 (아니, 그것은 두 곳 모두 같은 그것을하지 말아야 일어날 수있다 어떤 종류의 정렬 된 정렬을 기대하는 일부 GL 호출에

1

시작 부분에 다른 변수가 오른쪽 정렬되도록 패드가 있어야합니다. 끝 부분에 있으면 패드를 두지 않아도 이미 패딩 된 크기로 사라질 수 있습니다. 그곳에 신비가 없습니다.

힙 손상은이 작업과 관련이 없으며 새로운 크기 (즉, 임의의 기회)로 인해 다른 할당이 적용되어 노출됩니다.

+0

끝 부분에 없었습니다, 다음과 같은 긴 유형의 멤버가 있습니다 – user257620

관련 문제