Вверх ↑
Разработчик
Ответов: 26066
Рейтинг: 2120
#1: 2010-01-25 08:21:40 ЛС | профиль | цитата
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;
в данном случае, varWavHeader будет дуступен только один раз -- сразу после doGet по onGet, и это не является правильным

Мое мнение, код очень сырой и требует кардинальной доработки


карма: 22

1
Голосовали:3042