Форум: "Прочее";
Текущий архив: 2009.07.12;
Скачать: [xml.tar.bz2];
ВнизFastMM непонятно прав он или нет Найти похожие ветки
← →
ford © (2009-05-12 01:48) [0]Всем доброго времени суток
Вот поставил в проекте FastMM дабы проверить утечки памяти
ругается он жутко на вот такую вещь:
в ондной из процедур основного модуля программы, я выделяю память и передаю указатель другой процедуре
примерно вот такVar p:^Int64;
....
new(p);
p^:=1;
wr.AppendRec(SrcIndex,p);
...
где wr - объект класса и AppendRec собственно его метод
весь класс приводить смысла нет наверное (тем более он большой)
но основная его работа заключается в следующем:
у него есть массив структур где, струтктура имеет поле индескса и указатель типа Pointer;
метод AppendRec, заполняет новую структуру в этотом массиве, и полю структуры, присваивает собственно переданный pointerProcedure TBuffer.AppendRec(Ind:Integer; Data:Pointer);
Begin
fdata[LastEl].Index:=Ind;
fData[LastEl].Data:=Data;
Inc(LastEl);
End;
есть также другие методы которые возвращают указатель из струтуры сохраненной в элементе массива.... и т.д.
но суть не в этом :)
деструктор в классе
делает следующееfor i:=1 to LastEl do
Begin
If (fdata[i].Data<>nil) Then
Begin
FreeMem(fData[i].Data);
End;
End;
Inherited;
т.е. я честно ежели поле Data<>nil освобождаю эту память
а вот FastMM ругается и говорит что ту память которую я выделил в строкеnew(p);
нифига я не освободил
кто прав?? :)
← →
ford © (2009-05-12 02:36) [1]блин прав fastMM
:)
не ту строку посмотрел
в процедуре был вызов другой функции результат которой просто 1 или -1
а вот в ней как раз таки и было выделение памяти
т.е. перед New
стояло
IF Present(SrcIndex)=-1 Then
Begin
New(p);
:)
обсчитался строками
← →
Игорь Шевченко © (2009-05-12 02:54) [2]Офигенное ООП. Руки отрывать
← →
brother © (2009-05-12 06:09) [3]может, для начала, исправить мозг?
← →
Andy BitOff © (2009-05-12 09:35) [4]fastMM всегда прав!
Даже тогда, когда на:
.dprvar
s: string;
begin
SplashImagePath := ExtractFilePath(ParamStr(0)) + "img\";
end;
Говорит, что;
Блок памяти был выделен и не освобожден. Размер: 68
This block was allocated by thread 0xB18, and the stack trace (return addresses) at the time was:
402DA8 [System][@GetMem]
7C817067 [Unknown function at RegisterWaitForInputIdle]
Блок в настоящее время используется для объекта класса: Unknown
Выделенный номер стал: 2666
Текущий дамп памяти из 256 байт начиная с адреса 7FF7CBE0:
...
В этом приложении происходят утечки памяти. Утечки блоков маленького размера (исключая ожидаемые утечки зарегистрированные по указателю):
53 - 68 байт: AnsiString x 1
← →
Тимохов_ (2009-05-12 15:37) [5]FastMM прав.
судя по приведенной информации ошибки вроде нет.
однако на будущее не надо брать через new, а отдавать через freemem, надо отдавать через dispose, причем тип указателя должен быть такой же как и при получении, иначе если будут в освобождаемой памяти строки (ну это не твой случай), то будут ошибки.
может у тебя fData от 0, а не от 1 индексируется?
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.07.12;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c