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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2011, 15:23   #1
maxeebon
 
Регистрация: 09.08.2011
Сообщений: 8
По умолчанию Проблема с переполнением памяти

Написал программу, но видимо где то забыл очистить память. В программе сделал класс для "бездонного" стека. Вопрос: Правильно ли реализован destroy класса? или я чегото недописал?

Код:
Код:

interface

DataType = TMyClass;
 PStack = ^Stack;
 Stack = record
  state: Byte;
  data: DataType;
  next: PStack;
 end;
 TStack = class
 private
  FHead: PStack; //FHead всегда указывает на верхний элемент
  FCheckEmpty: boolean; //false если стек пустой
 public
  destructor destroy;
  procedure Add(Data: DataType);
  function Take: DataType;
  function look: DataType;  
  property CheckEmpty: boolean read FCheckEmpty;
 end

implementation

destructor TStack.destroy;
var
 tmp: PStack;
begin
 tmp := FHead;
 while tmp <> nil do
 begin
  FHead := Fhead^.next;
  tmp^.data.Free;
  dispose(tmp);
  tmp := FHead;
 end;
end;

procedure TStack.Add(Data: DataType);
var
 temp: PStack;
begin
 if FCheckEmpty = false then
 begin
  FCheckEmpty := true;
  new(FHead);
  FHead^.data := Data;
  FHead^.next := nil;
 end
 else
 begin
  new(temp);
  temp^.next := Fhead;
  Fhead := temp;
  Fhead^.data := Data;
 end;
end;

function TStack.Take: Datatype;
var
 temp: PStack;
begin
 if FcheckEmpty = true then
 begin
  result := FHead^.data;
  temp := FHead;
  Fhead := Fhead^.next;
  dispose(temp);
 end;
 if FHead = nil then
  FCheckEmpty := false;
end;

function TStack.look: DataType;
begin
 result := Fhead^.data;
end;
maxeebon вне форума Ответить с цитированием
Старый 19.08.2011, 15:46   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Правильно ли реализован destroy класса?
Неправильно и объявлен и реализован (отсутствует спецификатор перекрытия override и вызов унаследованного деструктора), хотя в случае прямого наследования TObject (у тебя именно этот случай) это не принципиально.
Да и вызова деструктора как таковой у тебя отсутствует напрочь.

TMyClass - это у тебя что ? Некий класс ? Тогда где вызов деструктора объектов этого класса ?
mss вне форума Ответить с цитированием
Старый 19.08.2011, 17:50   #3
maxeebon
 
Регистрация: 09.08.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Неправильно и объявлен и реализован (отсутствует спецификатор перекрытия override и вызов унаследованного деструктора), хотя в случае прямого наследования TObject (у тебя именно этот случай) это не принципиально.
Да и вызова деструктора как таковой у тебя отсутствует напрочь.

TMyClass - это у тебя что ? Некий класс ? Тогда где вызов деструктора объектов этого класса ?
класс удаляется тут

Код:
destructor TStack.destroy;
 ...
 tmp^.data.Free;
 ...
end;
А оверрайд тут нужен или где?

Код:
 public
  ...
  destructor destroy; override;
  ...
Цитата:
Сообщение от mss Посмотреть сообщение

Да и вызова деструктора как таковой у тебя отсутствует напрочь.
А зачем сейчас вызов, если это просто описание класса? Вызывать деструктор буду соответственно во время работы основной программы.

Последний раз редактировалось maxeebon; 19.08.2011 в 17:54.
maxeebon вне форума Ответить с цитированием
Старый 19.08.2011, 20:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Stack = record
А я бы описал это не записью а классом, тогда можно было бы изучить устройство TObjectList и использовать его механизмы в своей программе, или еще проще - использовать TObjectList, который следит за уборкой мусора.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.08.2011, 22:09   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://www.gunsmoker.ru/2009/05/blog-post_24.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с установкой оперативной памяти! Банжо Компьютерное железо 3 20.02.2011 13:15
Проблема с освобождением памяти Vyachek2010 Общие вопросы Delphi 15 08.02.2011 17:05
Проблема с переполнением кучи. NSvirus Паскаль, Turbo Pascal, PascalABC.NET 4 14.11.2010 21:57
Проблема с утечкой памяти ExPeL Win Api 4 21.10.2010 22:13
Проблема с виделением памяти! FreTFuL Общие вопросы C/C++ 1 07.05.2010 20:23