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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2013, 18:34   #1
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию Работа с классами

День добрый господа. Сразу вопрос:
Допустим есть в моём распоряжении класс TMyClass и объект MyClass1: TMyClass. Освободится ли память занимаемая объектом, если я вызову FreeMem(MyClass1)? Какие проблемы может повлечь подобный ход?

Зачем это нужно? У меня односвязный список должен хранить любую информацию, в том числе и объекты классов, а по завершении программы он должен почистить все информационные поля.
RomiKon вне форума Ответить с цитированием
Старый 26.03.2013, 19:20   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Какие проблемы может повлечь подобный ход?
Вылеты, нагоняй от виндовс.
FreeMem есть антогонист GetMem и потому их нужно использовать в паре и строго симметрично.
MyClass1.Free - вот решение по фень-шую.
Цитата:
У меня односвязный список должен хранить любую информацию, в том числе и объекты классов
Вот Вы их в деструкторе и удалять должны, как говорится кто нагадил, тот и убирает, причем в обратном порядке желательно (кто создался последним, того лучше убрать первым). Не нравится - топайте в языки со сборкой мусора.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 26.03.2013, 19:51   #3
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

Вы видно меня не поняли.
В элементе списка хранится указатель, и сам список не знает какие данные он хранит, следовательно и обращаться к ним не может.
Код:
TNode = class
    private
      FData: Pointer;
      FNext: TNode;
    public
      constructor Create; overload;
      constructor Create(AData: Pointer); overload;
      constructor Create(ANext: TNode); overload;
      constructor Create(AData: Pointer; ANext: TNode); overload;
      property    Data: Pointer read FData write FData;
      property    Next: TNode read FNext write FNext;
      procedure   FreeData;
      procedure   Free;
  end;
  TSingleLinkedList = class
    private
      FFirst: TNode;
      function  FCount: Integer;
      procedure FSetLength(AValue: Integer);
      function  FGetNodeToIndex(AIndex: Integer): TNode;
      function  FGetTailNode: TNode;
    public
      constructor Create;
      procedure   AddToEnd(AData: Pointer); virtual;
      procedure   AddToBegin(AData: Pointer); virtual;
      property    Count: Integer read FCount write FSetLength;
      property    First: TNode read FFirst write FFirst;
      property    Nodes[AIndex: Integer]: TNode read FGetNodeToIndex;
      procedure   Free;
  end;

...

procedure TNode.FreeData;
begin
  if FData <> nil then
    FreeMem(FData);
end;

procedure TNode.Free;
begin
  FreeData;
  if FNext <> nil then
    FNext.Free;
  Inherited;
end;

...

procedure TSingleLinkedList.Free;
begin
  if FFirst <> nil then
    FFirst.Free;
  Inherited;
end;
RomiKon вне форума Ответить с цитированием
Старый 26.03.2013, 20:04   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Вы видно меня не поняли.
Естественно, в первом вашем посте написано несколько иное.
В любом случае есть методика, и если Вы хотите избежать неожиданных и необъяснимых вылетов программы и утечек памяти, то
Код:
FreeMem(FData);
допускается только если где-то был GetMem с данной структурой.
Цитата:
и сам список не знает какие данные он хранит
И как один из возможных вариантов выхода из проблемы - что Вам мешает: а) Хранить инфу о природе объекта b) Пользоваться RTTI - Вы может и не в курсе, че там у Вас в очереди, но Дельфи то по-любому знает
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 26.03.2013 в 20:11.
Utkin вне форума Ответить с цитированием
Старый 26.03.2013, 21:21   #5
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

Ясно, спасибо. Будем пробовать.
RomiKon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с классами АндрейBAN C# (си шарп) 4 17.12.2012 13:10
Работа с классами на С++ darinadarina Помощь студентам 1 08.05.2012 18:34
работа с классами в си++ Zolotce Помощь студентам 4 01.04.2011 22:49
работа с классами jec Общие вопросы C/C++ 30 05.09.2010 00:03
Работа с классами Superlotles Общие вопросы C/C++ 6 16.06.2010 17:15