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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2010, 09:45   #41
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Согласен. Мы с ним в этом схожи.

Ну а так, как вариант, если нельзя но очень хочется вам как? Ведь работает же гадина
Sibedir вне форума Ответить с цитированием
Старый 22.12.2010, 09:56   #42
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

В том-то и дело, что не работает.

Код:
T := TObject.Create; // 1-й объект
P := T;
FreeAndNil(T);

T := TObject.Create; // 2-й объект

// P - допустим или нет?
Любая известная мне проверка укажет, что P - допустим, даже хотя это явно не так.

P.S. Вероятно, в таком варианте глупость подобных проверок будет более очевидна:

Код:
P := TObject.Create;
P.Free;

T := TObject.Create;

// P - допустим или нет? Проверка укажет, что да, а на самом деле - нет.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 22.12.2010, 10:25   #43
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Как раз, при использовании TSibObject, все становится на свои места.
Код:
T := TSibObject.Create; // 1-й объект
P := T;
FreeAndNil(T);
T := TSibObject.Create; // 2-й объект
P.Assigned будет равен False, а так оно и есть.
Код:
P := TSibObject.Create;
P.Free;
T := TSibObject.Create;
Опять, P.Assigned = False, следовательно обращение к ниму недопустимо.
Sibedir вне форума Ответить с цитированием
Старый 22.12.2010, 12:14   #44
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Как раз, при использовании TSibObject, все становится на свои места.
Да не может это становится на свои места. У вас, скорее всего, менеджер памяти просто перестраховывается.

Неужели не сообразили на что это был пример?

При выделении памяти под второй объект с хорошей вероятностью эта память может быть выделена на ровно том же самом месте, что и для старого объекта. Конечно, тут сильно зависит от менеджера памяти и его логики. Но суть примера в том, что не важно как, а такая ситуация всегда будет происходить. Ну, в каждом конкретном случае код может быть разным.

Соответственно, в примере:

Код:
P := TObject.Create;
P.Free;

T := TObject.Create;

// P равно T (случайно!)
Поэтому, не имеет значения, какие проверки вы примените к P - потому что все они будут тестироваться супротив реально существующего объекта T. Т.е. будут ложно-положительными.

Если же у вас проверка прошла - это значит, что вам повезло (или не повезло - смотря как посмотреть): просто менеджер памяти решил пока не использовать повторно старый блок памяти, а выделил новый. Понятно, что так или иначе, но старый блок памяти будет когда-то заново использован. И нет гарантии, что не под объект.

P.S. У вас FastMM?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 22.12.2010, 12:22   #45
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Sibedir, обращение к уже освобожденной памяти кучи всегда опасно.
поэтому советую принять за постулат такое:
"если объект уничтожен, то использовать его уже нельзя"
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2010, 12:25   #46
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Если же у вас проверка прошла - это значит, что вам повезло
Цитата:
обращение к уже освобожденной памяти кучи всегда опасно
Нет, нет. Посмотрите пожалуйста пример из поста #39. Там в TSibObject переопределены NewInstance и FreeInstance.
Код:
class function TSibObject.NewInstance: TObject;
var
  buf: PBoolean;
begin
  buf := _GetMem(InstanceSize + 4);
  Result := InitInstance(Pointer (Integer(buf) + 4));
  buf^ := True;
  _AddLabel (buf);
end;

procedure TSibObject.FreeInstance;
var
  buf: PBoolean;
begin
  CleanupInstance;
  buf := Pointer (Integer(Self) - 4);
  ReallocMemory (buf, 4);
  buf^ := False;
end;
Цитата:
P.S. У вас FastMM?
Не, менеджер памяти не трогаю.
Sibedir вне форума Ответить с цитированием
Старый 22.12.2010, 12:28   #47
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Там в TSibObject переопределены NewInstance и FreeInstance.
а однако утечки памяти тогда.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2010, 12:38   #48
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Поясни ...
Sibedir вне форума Ответить с цитированием
Старый 22.12.2010, 12:41   #49
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Эй, да с такой логикой можно юзать SafeMM - он вообще никогда память не отпускает Весьма здорово для отладки, но сомнительно для практических целей. Чем дольше работает программа, тем больше памяти она сожрёт, пока в итоге вся машина не упадёт на колени под непосильной нагрузкой.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 22.12.2010, 12:43   #50
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
ReallocMemory (buf, 4);
эти 4 байта где освобождаются?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неправильно выделена память. С++ Purr Помощь студентам 7 31.10.2010 20:05
Как передвигать объект если он не под формой.VB somebody94 Помощь студентам 1 29.06.2010 10:07
Объект PageSetup. Как проверить пустые ли колонтитулы в документе Word?? =) YaponskijGorodovoj Компоненты Delphi 0 09.06.2010 23:09
динамически выделить память под верхний треугольник квадратной матрицы juventine Общие вопросы C/C++ 2 12.04.2009 13:06
Память, выделяемая под приложение. Altera Компоненты Delphi 4 30.11.2008 18:13