Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2010, 09:07   #1
Gypsy
Пользователь
 
Регистрация: 16.10.2009
Сообщений: 42
По умолчанию Высвобождение памяти из под указателей

Здравствуйте!
Разъясните, пожайлуста!
Использую некую запись и класс и указатели на них.
Вида:
Код:
type trecord = record
   a: integer;
   b: integer;
end;

type tarecord = array of trecord;

type ptarecord = ^tarecord;
type ptclass1 = ^tclass1;

var parecord: ptarecord;
pclass1: ptclass1;
....

когда использую, пишу:
new(parecord);
new(paclass1);
...
...
при окончании работы освобождаю память:
dispose(parecord); // <- здесь выдает ошибку
dispose(pclass1); // <- и здесь тоже выдает ошибку
Если пишу так:
parecord:=nil;
pclass1:=ni;
то без ошибок, но высвобождаю ли я память?

Заранее спасибо!

Последний раз редактировалось Gypsy; 27.01.2010 в 09:23.
Gypsy вне форума Ответить с цитированием
Старый 27.01.2010, 09:17   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Попробуй как надо :
Код:
if parecord <> nil then Release(parecord);
И т.д.
If тут просто для подстраховки, вдруг указатель не был создан по какой-то причине ...
А вообще присваивание NIL указателю - это и есть высвобождение памяти.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 27.01.2010, 09:22   #3
Gypsy
Пользователь
 
Регистрация: 16.10.2009
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Kotofff Посмотреть сообщение
Попробуй как надо :
Код:
if parecord <> nil then Release(parecord);
И т.д.
If тут просто для подстраховки, вдруг указатель не был создан по какой-то причине ...
А вообще присваивание NIL указателю - это и есть высвобождение памяти.
Спасибо, но если NIL - это и есть ыысвобождение памяти, чем не подходит запись вида:
if parecord <> nil then parecord:=nil;
или просто parecord:=nil;
Gypsy вне форума Ответить с цитированием
Старый 27.01.2010, 09:28   #4
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Да я ж не спорю - делай так.
Способов то море ...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 27.01.2010, 13:53   #5
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Цитата:
Сообщение от Gypsy Посмотреть сообщение
Код:
type tarecord = array of trecord;

type ptarecord = ^tarecord;
type ptclass1 = ^tclass1;
У тебя тип tarecord является динамическим массивом, а динамические массивы уже сами по себе и есть указатели. И когда ты используешь ptarecord, то, получается, работаешь с указателем на указатель, что, в данном случае, довольно бессмысленно. Для инициализации переменной типа tarecord достаточно использовать Initialize и/или SetLength, для финализации - Finalize, без New и Dispose. Присваивание переменным nil в твоем случае не освобождает памяти, т.к. указатели в делфи не являются умными указателями (кроме интерфейсов, но это не твой случай), происходит просто обнуление ссылки. Все вышесказанное в полной мере справедливо и для классов - экземпляры классов в делфи тоже являются указателями и для работы с ними не следует использовать New и Dispose, вместо этого используются конструкторы и деструкторы. Если еще не знаешь, как создаются и уничтожаются экземпляры классов, то делается это так:
Код:
var
  SomeClass : TSomeClass;
begin
  { Создаем экземпляр класса }
  SomeClass := TSomeClass.Create;
  { ...
    Здесь как-то работаем с созданным экземпляром
    ... }
  { Уничтожаем экземпляр }
  SomeClass.Free;
end;
Для уничтожения экземпляра класса так же хорошо использовать процедуру FreeAndNil - она уничтожает экземпляр и обнуляет переменную.
maxionans вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массив указателей в С ++ серг Помощь студентам 1 14.12.2009 18:49
Проверка успешности выделения памяти под динамический масств(С) Александр Елис Помощь студентам 1 06.11.2009 10:00
динамическое выделение памяти под верхний треугольник квадратной матрицы juventine Помощь студентам 2 12.04.2009 13:02
Динамическое выделение памяти под массивы Артем125 Общие вопросы C/C++ 4 07.04.2009 09:52