![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
New(), Dispose() TaskManager [D6, WinXP]
DVM © (2003-10-15 13:02:00)
Случайно, разбирая поведение одной своей программы заметил, что если я выделяю в программе память с помощью New и освобождаю с помощью Dispose, то объем памяти, занимаемой моей программой (по данным из TaskManagera от XP) только увеличивается и никогда не уменьшается. Причем память реально освобождается, потому как обратиться к освобожденному участку уже нельзя. Что это? Особенность менеджера памяти или так не должно быть?
DVM (2003-10-16 12:22:00) [1]
Собственно нашел я ошибку - простая опечатка, освобождал не ту переменную.
Всем спасибо за участие.
DVM (2003-10-15 15:49:00) [2]
> Skier © (15.10.03 15:45) [14]
Что ж. Жаль. Буду разбираться сам. Или попробую сделать урезанный вариант кода и тогда размещу здесь.
Всем большое спасибо!
Skier (2003-10-15 15:45:00) [3]
> Если конечно Вы не против.
К сожалению, я против. Есть своя работа...
DVM (2003-10-15 15:43:00) [4]
> Skier © (15.10.03 15:34) [12]
>
> Если проблема не надуманная, то часто бывает так что когда
> в форум постят реальный код, а не пример, то вот тут ларчик
> и открывается...
Проблема реальная, но, к сожалению кода с собой нет, он дома, а я на работе. К тому же сам исходный код огромный, я думаю не стоит его сюда. Если Вы, Анатолий, не против, я вышлю вам несколько позднее исходник на почтовый ящик. Если конечно Вы не против.
Может статься, что я просто не замечаю какой-нибудь банальной ошибки в коде. Может быть.
Skier (2003-10-15 15:34:00) [5]
> . Конечно у меня исходный код не такой примитивный, там
> у меня есть TabControl, с каждым итемом которого связаны
> дополнительные данные.
Если проблема не надуманная, то часто бывает так что когда в форум постят реальныйкод, а не пример, то вот тут ларчик и открывается...
DVM (2003-10-15 15:27:00) [6]
> Игорь Шевченко © (15.10.03 15:17) [10]
> MemProof конкретно на этот кусок кода не ругается :)
Нет он ругается конкретно на выделение/освобождение памяти и указывает конретно на номер строки в исходном коде, которое происходит так как я написал.
Игорь Шевченко (2003-10-15 15:17:00) [7]
MemProof конкретно на этот кусок кода не ругается :)
DVM (2003-10-15 15:16:00) [8]
> Skier © (15.10.03 15:00) [8]
А вот MemProof ругается. А говорят, что верить ему можно. Конечно у меня исходный код не такой примитивный, там у меня есть TabControl, с каждым итемом которого связаны дополнительные данные. Но суть та же.
Skier (2003-10-15 15:00:00) [9]
>DVM © (15.10.03 14:56) [7]
С точки зрения работы с памятью, кусок кода правильный.
DVM (2003-10-15 14:56:00) [10]
Вот набросал кусок, примерно на такой же ругается MemProof. Но мне не понятно почему. Он говорит, что 3 раза не освободили память.
program demo;
type
PMyData = ^TMyData;
TMyData = record
aaa: integer;
bbb: integer;
end;
var
x: array[1..3] of integer;
p: PMyData;
procedure p1;
var
i: integer;
begin
for i:=1 to 3 do
begin
New(P);
P^.aaa:=5;
P^.bbb:=7;
x[i]:=longint(P);
end;
end;
procedure p2;
var
i: integer;
begin
for i:=1 to 3 do
begin
Dispose(PMyData(x[i]));
end;
end;
begin
p1;
p2;
end;
Игорь Шевченко (2003-10-15 14:37:00) [11]
DVM © (15.10.03 14:17)
MemProof"у можно верить
DVM (2003-10-15 14:17:00) [12]
> Игорь Шевченко © (15.10.03 13:34) [4]
А кому тогда верить? Пробовал MemProof, так тот вообще говорит, что я не освобождаю память. А дело лишь в том, что выделение и освобождение памяти в разных процедурах находятся. Ставишь в одну - он не ругается. Есть вообще нормальное средство для отслеживания утечек памяти?
Игорь Шевченко (2003-10-15 13:34:00) [13]
Не верьте Task Manager"у. Он никогда не показывает память, которую занимает программа.
Владислав (2003-10-15 13:26:00) [14]
Особенность.
KSergey (2003-10-15 13:24:00) [15]
Подозреваю, что не только когда выходишь, иногда и в процессе, но не сразу - это точно.
[lamer]Barmaglot (2003-10-15 13:06:00) [16]
Особенности менеджера. Дельфи РЕАЛЬНО освобождает память, только когда ты из неё выходишь.