Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.06.2012, 10:04
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию как узнать была ли распределена память PByte

Есть ли в Delphi функция которая узнаёт была ли распределена память для PByte ?
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #2  
Старый 29.06.2012, 11:17
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Использовать Assigned (в хелпе довольно подробно расписано), только нужно внимательно относится к переменным и не забывать про Буратину и яблоки
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение:
ined (29.06.2012)
  #3  
Старый 29.06.2012, 11:24
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Вот по этому мне нужно знать сколько же всё таки яблок у буратино Спасибо. Я стараюсь не забывать чистить память от не нужного.
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #4  
Старый 29.06.2012, 12:22
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

эх не получилось, что я хотел.
Код:
procedure BoolMem(var p:pointer; NewSize:cardinal);
begin
  if Assigned(p) then FreeMem(p,MSize);
  GetMem(p,NewSize);
  MSize:=NewSize;
end;
MSize - это предыдущая длинна.
Условие таково, что бы при первичном входе в эту процедуру не срабатывал FreeMem.
Что можете предложить по этому вопросу?
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #5  
Старый 29.06.2012, 12:29
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

а как же VirtualQuery?
Вроде должно помочь в твоей ситуации.
http://www.podgoretsky.com/ftp/Docs/...tualQuery.html
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 29.06.2012, 12:38
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Для первого входа:
Код:
p:=nil;
MSize:=15;
BoolMem(p,MSize);
распределит 15 байт памяти и упасть не должен.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 29.06.2012, 13:06
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Для первого входа:
Код:
p:=nil;
MSize:=15;
BoolMem(p,MSize);
распределит 15 байт памяти и упасть не должен.
В том всё и дело, что первичный вход не определён.В этом и есть вся особенность.

Цитата:
Сообщение от M.A.D.M.A.N.
а как же VirtualQuery?
А как его можно сюда прикрутить?
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #8  
Старый 29.06.2012, 14:18
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Я ж дал ссылку с описанием как она работает.
Просто поинтер передать, а дальше флаги проверять MEM_COMMIT или че-то в этом роде.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #9  
Старый 29.06.2012, 14:26
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Я ж дал ссылку с описанием как она работает.
Просто поинтер передать, а дальше флаги проверять MEM_COMMIT или че-то в этом роде.
Вот так я написал
Код:
procedure BoolMem(var p:pointer; NewSize:cardinal);
var B:TMemoryBasicInformation;
begin
  if VirtualQuery(p,B,MSize) = S_OK then
  FreeMem(p,MSize);
  GetMem(p,NewSize);
end;
Получается полная ерунда
При первом входе MSize может иметь разные значения.
Пробовал При MSize:= 0 - 20 он пропускает.
Это не есть хорошо!!!
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #10  
Старый 29.06.2012, 14:33
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Да а ссылку NOD32 не пропустил!!!!!
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #11  
Старый 29.06.2012, 14:35
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

А еслиб авира запищала, вы бы и ей верили?
Ответить с цитированием
  #12  
Старый 29.06.2012, 15:07
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от ined
Вот так я написал
Так эта штукень результаты помещает в "B:TMemoryBasicInformation;".

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx


Вот из MSDN
Цитата:
Syntax
Код:
SIZE_T WINAPI VirtualQuery(
  __in_opt  LPCVOID lpAddress,
  __out     PMEMORY_BASIC_INFORMATION lpBuffer,
  __in      SIZE_T dwLength
);
Parameters
lpAddress [in, optional]

A pointer to the base address of the region of pages to be queried. This value is rounded down to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function.

If lpAddress specifies an address above the highest memory address accessible to the process, the function fails with ERROR_INVALID_PARAMETER.
lpBuffer [out]

A pointer to a MEMORY_BASIC_INFORMATION structure in which information about the specified page range is returned.
dwLength [in]

The size of the buffer pointed to by the lpBuffer parameter, in bytes.

Return value

The return value is the actual number of bytes returned in the information buffer.

If the function fails, the return value is zero. To get extended error information, call GetLastError. Possible error values include ERROR_INVALID_PARAMETER.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 29.06.2012 в 15:09.
Ответить с цитированием
  #13  
Старый 29.06.2012, 15:07
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

1.
Код:
var
  b: PByte;
  mbi: MEMORY_BASIC_INFORMATION;
begin
  New(b);
  VirtualQuery(b, mbi, SizeOf(MEMORY_BASIC_INFORMATION));
...
2. по идее без инициализации указателя в нем может быть все что угодно: пустышка (если повезет очень сильно), указатель на адресное пространство процесса или вообще не пойми что. так что... инициализируйся
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 29.06.2012, 16:44
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Цитата:
Сообщение от ChinYan
А еслиб авира запищала, вы бы и ей верили?
Просто я стараюсь не отключат NOD32. Да бы, избежать всякого рода выползания на экран фигни которую не как не смыть.
У меня уже такое случалось, когда за спиной стоит тёща, а на экран, вдруг от куда не возьмись, появилась реклама штучек интимного характера.
Вот тогда было на её лице изумительно большие глазки, от увиденного
__________________
11011111 INED Home code
VK
Ответить с цитированием
  #15  
Старый 29.06.2012, 19:30
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

Всё я разобрался. Нашёл интересную для меня цитату -
__________________________________________________ ____________
Во всех известных версиях Delphi действует следующая не совсем документированная фишка (разработчики в документации к одной из версий сказали, что это так, но в будущей версии может и не быть. Но пока есть): Все глобальные переменные автоматически иницилизируются (нулём или пустым значением).
А вот локальные переменные - не иницилизируются.
__________________________________________________ _____________

В этом была вся проблема. Спасибо всем за внимание.
__________________
11011111 INED Home code
VK
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter