간단한 클래스 생성자가 작동하는 데 문제가 있습니다.클래스 생성자의 첫 줄에 크기 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
, instr
및 smp
이됩니다. GDB와 단계별
phead
,
instr
및
smp
가 그 전에, 올바르게 설정되어 계시 있지만 배열 포인터의 주소가 새로운
instr
배열에 할당 된 영역 내에있다.
&phead
을 검사하면이 사실이 밝혀졌습니다.
왜 더이 문제를 해결하거나 phead
, instr
및 smp
내가 무엇을 할 수에 사용되는 instr = new TXMInstrument[256];
할당 된 메모리 공간에 새로운 호출은 문제를 진단 하는가?
코드가 실제로는별로 좋지는 않지만, 거의 모든 라인에서 C++이 좋지는 않지만 그다지 잘못은 아닙니다. 오류는 다른 곳에 있어야합니다. 1882 란 무엇입니까? –
나는 또한 당신이 클래스가 유효하지 않은 메모리에서 생성되고 있다고 생각할 것이다. 아마도'XModule' 객체들의 배열의 끝을 지나서 하나가 될 것이다. 그것은 당신의 증상을 설명 할 것입니다. 'main (Extractor.cpp : 9)'근처에 코드를 보여주세요. –
크기 8을 쓰는 것은 'phead'가 잘못되었습니다 (즉, 클래스 자체가 유효하지 않은 메모리에 있음) 것을 의미합니다. 완벽한 테스트 케이스를 제공 할 수 있습니까? –