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, instr и smp.

Пошагового с БГДОМ показал, что phead, instr и smp установлены правильно, а до этого, но адреса указателей массива находятся в пределах области, что новые выделенная для instr массива. Изучение &phead показало, что это правда.

Почему новый вызов instr = new TXMInstrument[256]; Назначают пространство памяти, которое используется для phead, instr и smp и что я могу сделать, чтобы исправить это или дальнейшей диагностики проблемы?

+0

Хотя ваш код действительно нецелесообразен, плохой C++ почти в каждой строке, это не так. Ошибка должна быть в другом месте. Что такое линия 1882? –

+0

Я бы также предположил, что ваш класс строится в недопустимой памяти, возможно, один за концом массива объектов XModule. Это объяснит ваши симптомы. Покажите нам код возле 'main (Extractor.cpp: 9)' –

+0

Запись размером 8 означает, что это присвоение 'phead' недопустимо (т. Е. Сам класс находится в недопустимой памяти). Можете ли вы предоставить полный тест? –

ответ

4

Оказывается, в определении класса было множество #IFDEF, поэтому, когда я компилировал свою утилиту против библиотеки, созданной с помощью makefile проектов, она использовала заголовки источника и считала, что класс имеет различное количество свойств , поэтому они не были правильно упорядочены в памяти и были раздавлены распределением массивов.

Я решил это, не используя библиотеку проектов, скопировав исходные файлы в новую папку и запустив g++ *.cpp.