Эй, я работаю над драм-машиной, и у меня проблемы с векторами.Двойной свободный внутри деструктора при добавлении к вектору
Каждая последовательность имеет список образцов, а образцы упорядочены в векторе. Однако, когда образец является push_back на векторе, деструктор образца вызывается и приводит к двойной ошибке.
Вот код создания образца:
class XSample
{
public:
Uint8 Repeat;
Uint8 PlayCount;
Uint16 Beats;
Uint16 *Beat;
Uint16 BeatsPerMinute;
XSample(Uint16 NewBeats,Uint16 NewBPM,Uint8 NewRepeat);
~XSample();
void GenerateSample();
void PlaySample();
};
XSample::XSample(Uint16 NewBeats,Uint16 NewBPM,Uint8 NewRepeat)
{
Beats = NewBeats;
BeatsPerMinute = NewBPM;
Repeat = NewRepeat-1;
PlayCount = 0;
printf("XSample Construction\n");
Beat = new Uint16[Beats];
}
XSample::~XSample()
{
printf("XSample Destruction\n");
delete [] Beat;
}
И код 'Динамо', который создает каждый образец в векторе:
class XDynamo
{
public:
std::vector<XSample> Samples;
void CreateSample(Uint16 NewBeats,Uint16 NewBPM,Uint8 NewRepeat);
};
void XDynamo::CreateSample(Uint16 NewBeats,Uint16 NewBPM,Uint8 NewRepeat)
{
Samples.push_back(XSample(NewBeats,NewBPM,NewRepeat));
}
Вот главный():
int main()
{
XDynamo Dynamo;
Dynamo.CreateSample(4,120,2);
Dynamo.CreateSample(8,240,1);
return 0;
}
И это то, что происходит при запуске программы:
Starting program: /home/shawn/dynamo2/dynamo
[Thread debugging using libthread_db enabled]
XSample Construction
XSample Destruction
XSample Construction
XSample Destruction
*** glibc detected *** /home/shawn/dynamo2/dynamo: double free or corruption (fasttop): 0x0804d008 ***
Однако, когда удаление [] удаляется из деструктора, программа работает отлично.
Что вызывает это? Любая помощь приветствуется.
Почему вы не просто использовать ' вектор' в 'XSample'? – GManNickG
Согласитесь, 'Beat' должен быть вектором. – Bill