I'm having trouble getting a simple class constructor to work.
// 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;
}
When I run with valgrind I get the following error:
==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
The later in the line memset(instr,0,sizeof(TXMInstrument)*256); it zeroes out phead, instr and smp.
Stepping through with gdb revealed that phead, instr, and smp are set correctly, before that, but the addresses of the array pointers are within the area that new allocated for the instr array. Examining &phead revealed this to be true.
Why does new the call to instr = new TXMInstrument[256]; assign memory space that is used for phead, instr and smp and what can I do to fix this or further diagnose the issue?
XModule objects. That would explain your symptoms. Show us the code near main (Extractor.cpp:9)Mooing Duck 2012-04-04 23:50
phead that's invalid (i.e. the class itself is in invalid memory). Can you provide a complete test case - Oliver Charlesworth 2012-04-04 23:50
https://github.com/STRd6/Milky-Tracker/blob/49b0a897a731bb898ee545272d4998cb62e1523d/src/milkyplay/XModule.cpp
The project is MilkyTracker, a tool for creating sample based audio files. I'm trying to use a component of it to load XM files and extract data - Daniel X Moore 2012-04-04 23:52
It turns out there were a bunch of #IFDEFs in the class definition, so when I was compiling my utility against the library built with the projects makefile it was using the source headers and thought the class had a different amount of properties, so they were not arranged in memory correctly and got crushed by the allocation of the arrays.
I solved it by not using the projects library, copying the source files to a new folder, and running g++ *.cpp.