3042 писал(а):
С doCreate всё в порядкеНе в порядке, я показал тебе неправильность построения динамического класса, которое приводит к утечке памяти, и не очень маленькой, учитывая размер стрима
------------ Дoбавленo в 08.36:
Вот смотри, мне это совсем непонятно
procedure THIWaveHeader._work_doGet;
begin
FWavHeader := ReadStream(_Data,_data_WavHeader,nil);
FWavHeader.Position := 0;
FWavHeader.Read(WaveHdr,SizeOf(WAVHDR));
if (FWavHeader=nil) or (WaveHdr.riff <> 'RIFF') then
begin
FWavHeader.Free;
exit;
end;
_hi_OnEvent(_event_onGet);
FWavHeader.Free;
end;
Первая ошибка -- нельзя уничтожать чужой стрим, ты его не получаешь сам, а получаешь только указатель на него, те, нельзя, ни в коем случае, делать FWavHeader.Free в этом методе. И для этго лучше оформить другую глобальную переменную класса, так как дальше ты ее зачем-то пересоздаешь, да еще и не очищая. Кстати, а как твоя структура WaveHdr попадет в wav-файл, судя по коду -- никак, так как ты ее пишишь в пустую память, вновь созданного стрима, а не в уже уничтоженный тобой поток самого файла. К тому же, как после уничтожения стрима, ты его читать собрался вот здесь
procedure THIWaveHeader._var_varWavHeader;
begin
dtNull(_Data);
if Assigned(FWavHeader) then dtStream(_Data,FWavHeader);
end;
Мое мнение, код очень сырой и требует кардинальной доработки