49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419

Освобождение памяти от объектов

15.10.2013, 23:40. Показов 6728. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Итак.
Есть следующий код (элементы)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type
  TStage = class(TObject)
    level: integer;
    Hero: THero;
 
    bullets: TList<TBullet>;
    bots: TList<TBot>;
 
 
.  .  .  
 
procedure TStage.update;
. . . 
if bullets.Items[k - m - 1].y < -10 then
    begin
      bullets.Items[k - m - 1].Destoy;
      // Или же bullets.Items[k - m - 1].Free;
      bullets.Delete(k - m - 1);
      m := m + 1;
    end;
После того, как объект должен был "уничтожится", память, занимаемая им, так и остается занятой. Как полностью уничтожить этот объект, чтобы от него ничего не осталось. Проблема возникает в том, что после "выпускания" пары тысячи "пуль" игра вылетает с ошибкой "System out resource"...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2013, 23:40
Ответы с готовыми решениями:

Освобождение памяти
Вопрос по освобождению памяти. В цикле vList получает новую память и адрес соответственно и кладется в vHashTable. В блоке finally при...

Освобождение памяти
1) Так получилось, что у меня подряд появляются 4 формы. Каждый раз, как показывается следующая форма, я вызываю функцию free. В итоге...

Освобождение памяти из Webbrowser
Не могу освободить память после использования веббраузера! Инет облазил, там све способы корявые и выдают ошибку. Напишите какие знаете вы?

23
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
16.10.2013, 00:01
Используй TObjectList

http://www.base.vingrad.ru/view/3110-TObjectList

bullets.Items[k - m - 1].Destoy
Destoy ктати не удаляет обекты

По настоящему уничтожить его может только .Free
1
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
16.10.2013, 00:02  [ТС]
noname_club, а если я все-таки хочу через дженерики?
0
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
16.10.2013, 00:06
он вроде их поддерживает

http://docwiki.embarcadero.com... st_(Delphi)
1
angstrom
16.10.2013, 00:09
Цитата Сообщение от noname_club Посмотреть сообщение
Destoy ктати не удаляет обекты
Ещё как удаляет, но этот способ не рекомендуется использовать.
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
16.10.2013, 00:10
но этот способ не рекомендуется использовать
никто не знает почему
1
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
16.10.2013, 00:10  [ТС]
Free тоже ничего не удалял(
0
angstrom
16.10.2013, 00:11
Цитата Сообщение от Neon-z Посмотреть сообщение
Как полностью уничтожить этот объект, чтобы от него ничего не осталось
Использовать FreeAndNIL.
Free удаляет, но не чистит указатель.
пофигист широкого профиля
4761 / 3197 / 861
Регистрация: 15.07.2013
Сообщений: 18,548
16.10.2013, 00:15
Цитата Сообщение от angstrom Посмотреть сообщение
Использовать FreeAndNIL
Автору не поможет. Он переменными как таковыми не пользуется. Его засада где-то в другом месте. Может не все пули удаляются? А только те, которые попали куда-то не туда
1
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
16.10.2013, 00:15
но не чистит указатель
если указатель объявлен внутри процедуры то тоже чистить?

Delphi
1
2
3
4
5
6
procedure proc1;
var hello: TObject;
begin 
   hello := TObject.create;
   hello.free;
end;
1
пофигист широкого профиля
4761 / 3197 / 861
Регистрация: 15.07.2013
Сообщений: 18,548
16.10.2013, 00:17
Цитата Сообщение от noname_club Посмотреть сообщение
если указать объявлен внутри процедуры то тоже чистить?
Да их вообще чистить надо только в очень редких случаях.
1
angstrom
16.10.2013, 00:18
Цитата Сообщение от northener Посмотреть сообщение
Автору не поможет
С чего это?
Delphi
1
2
  FreeAndNil(bullets.Items[k - m - 1]);
  bullets.Delete(k - m - 1);
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
16.10.2013, 00:18  [ТС]
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
procedure TStage.fire;
var
  Bullet_: TBullet;
begin
  case currentArrowType of
    Bullet.FREEZE_ARROW:
    begin
      if countFreezeArrow <> 0 then
        Bullet_ := TBullet.Create(currentArrowType)
      else exit;
      countFreezeArrow := countFreezeArrow -1;
    end;
    Bullet.FIRE_ARROW:
    begin
      if countFireArrow <> 0 then
        Bullet_ := TBullet.Create(currentArrowType)
      else exit;
        countFireArrow := countFireArrow -1;
    end;
    Bullet.BOMB_ARROW:
    begin
      if countBombArrow <> 0 then
        Bullet_ := TBullet.Create(currentArrowType)
      else exit;
        countBombArrow := countBombArrow -1;
    end;
    Bullet.NORMAL_ARROW:
    begin
      Bullet_ := TBullet.Create(currentArrowType);
    end;
  end;
  Bullet_.x := Hero.x + 20;
  Bullet_.y := Hero.y;
  Bullet_.img := TBitmap.Create;
  Bullet_.img.LoadFromFile('bullet2.bmp');
  Bullet_.img.TransparentColor := Bullet_.img.canvas.Pixels[0, 0];
  Bullet_.img.Transparent := true;
  bullets.Add(Bullet_);
end;
вот создание пули. (прошу прощения за быдлокод). Может чем-то поможет данный код.
0
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
16.10.2013, 00:21
Bullet_.img := TBitmap.Create;
Bullet_.img.LoadFromFile('bullet2.bmp');
Bullet_.img.TransparentColor := Bullet_.img.canvas.Pixels[0, 0];
Bullet_.img.Transparent := true;
ужасы то какие

зачем по 100500 раз создавать битмап из файла? Может проще вынести его в переменную глобальной видимости или видимости класса и работать с указателем, без повторных загрузок?
1
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
16.10.2013, 00:30  [ТС]
я же попросил прощения У меня проблема в неудаляемости объектов.

Кстати,
Delphi
1
FreeAndNil(bullets.Items[k - m - 1]);
компилятор матерится...
0
Пишу на Delphi...иногда
 Аватар для cotseec
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
16.10.2013, 00:31
Delphi
1
FreeAndNil(TObject(bullets.Items[k - m - 1]));
1
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
16.10.2013, 00:33  [ТС]
cotseec, [dcc32 Error] Stage.pas(181): E2197 Constant object cannot be passed as var parameter - то же самое
0
angstrom
16.10.2013, 00:38
Ну напиши так
Delphi
1
2
3
  bullets.Items[k - m - 1].Free;
  bullets.Items[k - m - 1] := NIL;
  bullets.Delete(k - m - 1);
49 / 44 / 8
Регистрация: 06.09.2010
Сообщений: 419
16.10.2013, 00:40  [ТС]
angstrom, все так же память только растет...
0
angstrom
16.10.2013, 00:48
А это чистится?
Delphi
1
Bullet_.img := TBitmap.Create;
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.10.2013, 00:48
Помогаю со студенческими работами здесь

Освобождение памяти TChromium
Здравствуйте, товарищи! Такая проблема... TChromium создаю динамически и связываю с TChromeTabs. При закрытии вкладки...

TObjectList освобождение памяти
Доброго времени суток! Есть класс: TCreature = class CreatureName : string; Speed : single; Damage: real; ...

Pchar и освобождение памяти
Здравствуйте. Написал парсинг страницы сайта. Запрос страницы идёт из основной программы, после чего полученная строка передаётся в dll...

Освобождение памяти из переменных
В ходе сортировки у меня возникают несколько массивов с большой размерностью, если выполнять событие много раз, то используемая память...

не происходит освобождение памяти
Привет всем, делаю игрушку, создаю динамически массив кнопок(клавиатуру). За это отвечает независимая процедура. Так вот нужно сделать так,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Batch Transform и Batch Gizmo Drawing API в Unity
GameUnited 20.04.2025
В мире разработки игр и приложений на Unity производительность всегда была критическим фактором успеха. Создатели игр постоянно балансируют между визуальной привлекательностью и плавностью работы. . .
Звук в Unity: Рандомизация с Audio Random Container
GameUnited 20.04.2025
В современных играх звуковое оформление часто становится элементом, который либо полностью погружает игрока в виртуальный мир, либо разрушает атмосферу за считанные минуты. Представьте: вы исследуете. . .
Максимальная производительность C#: Советы, тестирование и заключение
stackOverflow 20.04.2025
Погружение в мир микрооптимизаций C# открывает перед разработчиком целый арсенал мощных техник. Но как определить, где и когда их применять? Ответ начинается с точных измерений и профилирования. . . .
Максимальная производительность C#: Предсказание ветвлений
stackOverflow 20.04.2025
Третий ключевой аспект низкоуровневой оптимизации — предсказание ветвлений. Эта тема менее известна среди разработчиков, но её влияние на производительность может быть колоссальным. Чтобы понять. . .
Максимальная производительность C#: Векторизация (SIMD)
stackOverflow 20.04.2025
Помимо работы с кэшем, другим ключевым аспектом низкоуровневой оптимизации является векторизация вычислений. SIMD (Single Instruction, Multiple Data) позволяет обрабатывать несколько элементов данных. . .
Максимальная производительность C#: Процессорный кэш
stackOverflow 20.04.2025
Знакомство с внутренним устройством процессорного кэша — ключевой шаг в написании по-настоящему быстрого кода на C#. Этот слой архитектуры компьютера часто ускользает от внимания разработчиков, но. . .
Максимальная производительность C#: Введение в микрооптимизации
stackOverflow 20.04.2025
В мире разработки на C# многие привыкли полагаться на . NET Runtime, который "магическим образом" сам оптимизирует код. И часто это работает - современные JIT-компиляторы творят чудеса. Но когда речь. . .
MVC фреймворк в PHP
Jason-Webb 19.04.2025
Архитектурный паттерн Model-View-Controller (MVC) – это не просто модный термин из мира веб-разработки. Для PHP-программистов это фундаментальный подход к организации кода, который радикально меняет. . .
Dictionary Comprehensions в Python
py-thonny 19.04.2025
Python славится своей выразительностью и лаконичностью, что позволяет писать чистый и понятный код. Среди множества синтаксических конструкций языка особое место занимают словарные включения. . .
Шаблоны и протоколы для создания устойчивых микросервисов
ArchitectMsa 19.04.2025
Микросервисы — архитектурный подход, разбивающий сложные приложения на небольшие, независимые компоненты. Вместо монолитного гиганта, система превращается в созвездие небольших взаимодействующих. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru