У меня возникли проблемы с получением простого конструктора классов.Недопустимая запись размера 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
и что я могу сделать, чтобы исправить это или дальнейшей диагностики проблемы?
Хотя ваш код действительно нецелесообразен, плохой C++ почти в каждой строке, это не так. Ошибка должна быть в другом месте. Что такое линия 1882? –
Я бы также предположил, что ваш класс строится в недопустимой памяти, возможно, один за концом массива объектов XModule. Это объяснит ваши симптомы. Покажите нам код возле 'main (Extractor.cpp: 9)' –
Запись размером 8 означает, что это присвоение 'phead' недопустимо (т. Е. Сам класс находится в недопустимой памяти). Можете ли вы предоставить полный тест? –