forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Менеджер памяти глючит (http://forum.boolean.name/showthread.php?t=4459)

elmortem 15.09.2007 23:18

Менеджер памяти глючит
 
Вот, набросал тут маленький тестик...

Код:

SuperStrict

Type CBase
        Field Name:String = Null
       
        Method New()
                DebugLog("New CBase")
                Name = "CBase"
        EndMethod
       
        Method Delete()
                DebugLog("Delete CBase("+Name+")")
                Name = Null
        EndMethod
EndType

GCCollect()
DebugLog("  Mem Alloc: "+String.FromInt(GCMemAlloced()))

Local Base:CBase = New CBase
'Base.Name = "Base"
Base = Null

GCCollect()
DebugLog("  Mem Alloc: "+String.FromInt(GCMemAlloced()))

Если запускать как есть, то всё ок. Объект создаётся, затем объект уничтожается. Если убрать коментарий, то объект уничтожаться не хочет. Непонятно почему... Если коментарий не убирать, а сделать переменную Base глобальной - то же самое, объект не уничтожается.
Может кто-то объяснит мне причину и способ с этим бороться? Или это всё же косяк Макса?

У кого есть доступ на офф.форум - может зададите этот вопрос? Был бы очень признателен.

dimanche13 15.09.2007 23:58

Re: Менеджер памяти глючит
 
Ну дык, а я про что говорил. Может надо задавать не автоматическую сборку мусора, а все вручную GCSetMode(2) потом GCCollect(). вообще х.з. надо офф.сайт шерстить день потерять, а может два, для не зареганых там поиска нет...

jimon 16.09.2007 00:50

Re: Менеджер памяти глючит
 
попробуй несколько раз GCCollect() вызывать

johnk 16.09.2007 07:01

Re: Менеджер памяти глючит
 
Если Delete() - встроенный деструктор, то не доверяй ему, переменуй этот метод и используй вместе Base = Null..может поможет :)

elmortem 16.09.2007 10:36

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

jimon 16.09.2007 11:45

Re: Менеджер памяти глючит
 
что значит не помогает ?! если руки не от туда растут
то есно что не поможет :)

у меня проект очень хорошо оперирует мегабайтами
внутри блицмакса ... и все тут же хорошо освобождается
и вообще утечек нет :)

я уже приводил пример,
все что создается имеет функцию Create
и все что удаляется имеет метод Free
задача Free тупо удалить все что внутри обьекта

потому если у тебя список TList таких обьектов
то сначала у всех вызови Free, а потом уже очисти список и приравняй его к нулю

все дело в глобальности подхода,
у меня такая система используется абсолютно во всех типах игры
потому утечек нету

elmortem 16.09.2007 16:05

Гм...
В общем заборол большую часть утечек. Буду думать дальше.
Интересный факт: если запихнуть создание и удаление глабального объекта в функцию, то всё работает. Т.е. не стоит создавать глобальные объекты "глобально"... (:
Так что распихал пока всё по функциям. (:

Всем этим умным указателям реально не хватает принудительного delete. Ну очень не хватает...

jimon 16.09.2007 18:52

Re: Менеджер памяти глючит
 
elmortem
если хочешь помучатся в добавок
посмотри в blitzmax\mod\brl.mod\blitz.mod\blitz_gc.h и c
там есть две команды bbGCRetain и bbGCRelease
и собсно bbGCFree

первые две управляют через щетчик использований
последняя тупо трет участок памяти

можно зделать какой нибудь дебаг
перебрать все обьекты на уровне либы и узнать что-же не удаляется

elmortem 16.09.2007 22:04

Re: Менеджер памяти глючит
 
Ну, узнать что не удаляется можно просто пересчитав в логе создавшиеся и удалившиеся объекты... (:


Часовой пояс GMT +4, время: 17:06.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot