2012-04-04 1 views
4

간단한 클래스 생성자가 작동하는 데 문제가 있습니다.클래스 생성자의 첫 줄에 크기 8의 쓰기가 유효하지 않습니다.

// In XModule.h 
class XModule 
{ 
... 
public: 
    TXMHeader  header;  // module header 
    TXMInstrument* instr;  // all instruments (256 of them) 
    TXMSample*  smp;  // all samples (256 of them, only 255 can be used) 
    TXMPattern*  phead;  // all pattern headers (256 of them) 
} 

Module.cpp

// In XModule.cpp 
.... 
XModule::XModule() 
{ 
    // allocated necessary space for all possible patterns, instruments and samples 
    phead = new TXMPattern[256]; // Line # 1882 
    instr = new TXMInstrument[256]; 
    smp = new TXMSample[MP_MAXSAMPLES]; 

    memset(&header,0,sizeof(TXMHeader)); 

    if (instr) 
    memset(instr,0,sizeof(TXMInstrument)*256); 

    if (smp) 
    memset(smp,0,sizeof(TXMSample)*MP_MAXSAMPLES); 

    if (phead) 
    memset(phead,0,sizeof(TXMPattern)*256); 

} 
.... 

Extractor.cpp

#include "Extractor.h" 
#include "XModule.h" 

#include <iostream> 
using namespace std; 

int main() 
{ 
    XModule* module = new XModule(); 
    SYSCHAR* fileName = "Greensleeves.xm"; 

    ... 

    return 0; 
} 

내가 Valgrind의 실행 나는 다음과 같은 오류 얻을 :

==21606== Invalid write of size 8 
==21606== at 0x408BD3: XModule::XModule() (XModule.cpp:1882) 
==21606== by 0x4012D8: main (Extractor.cpp:9) 
==21606== Address 0x64874f0 is not stack'd, malloc'd or (recently) free'd 

라인의 이상을 memset(instr,0,sizeof(TXMInstrument)*256);이면 phead, instrsmp이됩니다. GDB와 단계별

phead, instrsmp가 그 전에, 올바르게 설정되어 계시 있지만 배열 포인터의 주소가 새로운 instr 배열에 할당 된 영역 내에있다. &phead을 검사하면이 사실이 밝혀졌습니다.

왜 더이 문제를 해결하거나 phead, instrsmp 내가 무엇을 할 수에 사용되는 instr = new TXMInstrument[256]; 할당 된 메모리 공간에 새로운 호출은 문제를 진단 하는가?

+0

코드가 실제로는별로 좋지는 않지만, 거의 모든 라인에서 C++이 좋지는 않지만 그다지 잘못은 아닙니다. 오류는 다른 곳에 있어야합니다. 1882 란 무엇입니까? –

+0

나는 또한 당신이 클래스가 유효하지 않은 메모리에서 생성되고 있다고 생각할 것이다. 아마도'XModule' 객체들의 배열의 끝을 지나서 하나가 될 것이다. 그것은 당신의 증상을 설명 할 것입니다. 'main (Extractor.cpp : 9)'근처에 코드를 보여주세요. –

+0

크기 8을 쓰는 것은 'phead'가 잘못되었습니다 (즉, 클래스 자체가 유효하지 않은 메모리에 있음) 것을 의미합니다. 완벽한 테스트 케이스를 제공 할 수 있습니까? –

답변

4

#IFDEFs가 클래스 정의에 많이 있었으므로 프로젝트 makefile로 빌드 된 라이브러리에 대해 유틸리티를 컴파일 할 때 소스 헤더를 사용하고 있었고 클래스에 다른 속성이 있다고 생각했습니다 , 그래서 그들은 정확하게 기억에 배열되지 않았고 배열의 할당에 의해 부서졌다.

프로젝트 라이브러리를 사용하지 않고 소스 파일을 새 폴더에 복사하고 g++ *.cpp을 실행하여 해결했습니다.