2012-06-19 3 views
0

나는 다음 클래스 선언이 :힙 손상 -로드 파일 (스태틱)

class StaticMesh 
{ 
public: 
    unsigned int v_count; 
    float* vertices; 
    unsigned int n_count; 
    float* normals; 

    void Load_lin(const char* file); 
    void Draw(void); 
    void Release(void); 
}; 

이 클래스 (이 이름은 표시의로) 파일을 .lin로드 할 수 있습니다 정적 메쉬를 나타냅니다.

.lin 파일은 C#을 사용하여 만든 다른 응용 프로그램에서 생성됩니다. 이 애플리케이션 파일 .OBJ 판독하고,이 구조를 갖는 .lin 파일 생성

V 정점의 개수 N 법선 수, A/B가있다
v_count v 
n_count n 
a#a#a 
b#b#b 
a#a#a 
b#b#b 

좌표를 표현한다.

Load_lin (CONST의 char *)는이 파일을로드하는 기능이며, 여기있다 :이 기능에 오류의 원인을 좁혀했습니다

void StaticMesh::Load_lin(const char* file) 
{ 
    std::ifstream in (file); 

    if (!in) 
    { 
     std::cout << "Error: Failed to load staticmesh from '" << file << "'." << std::endl; 
     return; 
    } 

    char buffer[256]; 

    in.getline(buffer, 256); 
    sscanf_s(buffer, "v_count %i", &v_count); 
    in.getline(buffer, 256); 
    sscanf_s(buffer, "n_count %i", &n_count); 

    vertices = new float[v_count]; 
    normals = new float[n_count]; 

    unsigned int a = 0; 
    unsigned int p = 0; 
    float x, y, z; 

    do 
    { 
     in.getline(buffer, 256); 
     if (buffer[0] == '\n' || buffer[0] == '\r') break; 

     sscanf_s(buffer, "%f#%f#%f", &x, &y, &z); 
     vertices[a++] = x; 
     vertices[a++] = z; 
     vertices[a++] = y; 

     in.getline(buffer, 256); 

     sscanf_s(buffer, "%f#%f#%f", &x, &y, &z); 
     normals[p++] = x; 
     normals[p++] = z; 
     normals[p++] = y; 

    } while (!in.eof()); 
    in.close(); 
} 

그러나 오류는 쇼 응용 프로그램이 닫히고 때로는 발생하지 않습니다.

return msn.message; 

내가 더 가서 변수 'A'와 'P',이 원인을 인쇄하는 표준 : : cout을 사용했습니다 :

그래서 오류가 발생한 라인은 실제의 WinMain의 끝 힙 손상 오류,하지만 malloc.c를 라인 (55)이 시간 :

__forceinline void * __cdecl _heap_alloc (size_t size) 
{ 

    if (_crtheap == 0) { 
     _FF_MSGBANNER(); /* write run-time error banner */ 
     _NMSG_WRITE(_RT_CRT_NOTINIT); /* write message */ 
     __crtExitProcess(255); /* normally _exit(255) */ 
    } 

    return HeapAlloc(_crtheap, 0, size ? size : 1); 
} // LINE 55 

나는 아무 소용이 마지막 오류를 검색했습니다.

감사합니다. :)

+0

로 할당을 수정합니다. –

답변

2

나는 v_count와 n_count가 의 정점으로 된 숫자을 언급한다고 생각한다. 코드에 따르면 각 정점에는 3 개의 구성 요소 (x/y/z)가 있고 각 구성 요소는 float 변수에 저장된입니다. 즉, 번을 번 v_count 번과 n_count 번 3 번을 정점과 법선에 각각 할당해야합니다.

즉 내가이 질문은 첫 번째 코드 검토로 이동해야한다고 생각

vertices = new float[v_count * 3]; 
normals = new float[n_count * 3]; 
+0

여기에 게시하기 전에 코드를 다시 작성해야합니다. 감사합니다. 내가 알아 차렸을 xD – zeluisping

1

v_count v은 읽은 숫자가 (unsigned int)'v'임을 의미합니다. 그리고 나서 당신은 vertices = new float[v_count];입니다. 충분한 저장 공간을 할당하지 않고 배열 verticesnormals의 경계를 벗어나 쓸 수 없으므로 정의되지 않은 동작이 발생합니다.

+0

내 생각에 영업 이익은 그의 배당금에서 3 배가되어야합니다 ... –

+0

예, 약간 이상한 이유로 3 배로하는 것을 잊었습니다. 게시하기 전에 함수를 다시 작성해야합니다. 고맙습니다. – zeluisping

0

원시 포인터 대신 std :: vector를 사용하도록 코드를 다시 작성해보십시오. 이렇게하면 힙 손상으로 인한 문제를 피할 수 있습니다.

+0

나는 내 자신의 Vector 클래스를 가졌지 만이 애플리케이션은 D3D와 OpenGL을 사용할 수 있기 때문에 원시 데이터를 원한다. – zeluisping

+0

std :: vector :: data가 원시 데이터를 얻습니다. – paulm