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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2011, 08:54   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Восклицание Сборщик мусора для отдельного класса

Сабж в названии темы. Стоит ли делать подобное либо выгоднее ручками управлять памятью?
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 10:22   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Сабж в названии темы. Стоит ли делать подобное либо выгоднее ручками управлять памятью?
Определите, что конкретно обязан выполнять данный класс, так же, придерживайтесь к правилам архитектуры других классов в вашем приложение, иначе при использовании классов вы можете запутаться, одни объекты будут сами освобождаться, другие наоборот "утекать" что явно плохо и трудно запомнить что и как работает.
BOBAH13 вне форума Ответить с цитированием
Старый 13.08.2011, 10:26   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ну просто видите ли, я пока что не очень понимаю, как создать обобщённый сборщик мусора, т.е. для всех типов. Да, как-то с шаблонами, но просто не понимаю как хранить или искать ненужную память. И в этом-то классе создал отдельный класс GC, перегрузил операторы new и delete в моём классе MyClass, добавив в них вызов функции сохранения ссылки на выделенную память.
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 10:34   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Ну просто видите ли, я пока что не очень понимаю, как создать обобщённый сборщик мусора, т.е. для всех типов. Да, как-то с шаблонами, но просто не понимаю как хранить или искать ненужную память. И в этом-то классе создал отдельный класс GC, перегрузил операторы new и delete в моём классе MyClass, добавив в них вызов функции сохранения ссылки на выделенную память.
Если серьезно намерены сборщик делать, то по моему, самый простой вариант создать базовый собственный класс типа Object, в нем как вы сделали, перегрузить new delete и наследовать уже от него все остальные классы. Т.е. Вы скрываете всю рутину сборки простым наследованием.

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

Последний раз редактировалось BOBAH13; 13.08.2011 в 10:37.
BOBAH13 вне форума Ответить с цитированием
Старый 13.08.2011, 10:38   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Спасибо за совет.
Ну и всё-таки, получается, что я реализую сборщик только для моих типов(хотя мне этого достаточно пока что), т.е. для MyClass1,MyClass2, и т.д. А вот вообще реально ли реализовать сборщик и для встроенных типов, т.е. для int, float,double и проч.? Или это реализуемо только на уровне компилятора?

А у меня сборщик неявно вызывается, кстати...Он сам вызывает свою функцию сборки в своём же деструкторе, т.е. при таком коде
Код:
int main()
{
    MyClass* mc = new MyClass[3];
    cin.get();
    mainGC.count();
    return 0;
}
Сборка будет выполнена. mainGC.count() - вывод количества собранных ссылок.

Последний раз редактировалось _-Re@l-_; 13.08.2011 в 10:41.
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 10:46   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Спасибо за совет.
Ну и всё-таки, получается, что я реализую сборщик только для моих типов(хотя мне этого достаточно пока что), т.е. для MyClass1,MyClass2, и т.д. А вот вообще реально ли реализовать сборщик и для встроенных типов, т.е. для int, float,double и проч.? Или это реализуемо только на уровне компилятора?
Вы не много путаете, типы которые вы примели не имеют конструкторов в с++ они нативные, т.е. Нет смысла для них что то делать. Я хочу сказать, что создание сборщика это дополнительная сложность (внесение новых правил) т.е. Путаница, т.к. всеравно придется использовать и другие классы, если конечно вы не собственный фреймыорк пишите.

На счет "только уровня компилятора", можно через макросы или написать свой небольшой интерпритатор и встроить его в цепочку сборки проекта. Все упирается в зачем и нужно ли?
BOBAH13 вне форума Ответить с цитированием
Старый 13.08.2011, 10:47   #7
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Все упирается в зачем и нужно ли?
Дак вот например такой код...
Код:
int main()
{
    int* x = new int;
    return 0;
}
И как бы получается утечка...Хотя, вроде бы Windows освобождает всю выделенную память даже если программист её не освободил.
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 11:04   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Дак вот например такой код...
Код:
int main()
{
    int* x = new int;
    return 0;
}
И как бы получается утечка...Хотя, вроде бы Windows освобождает всю выделенную память даже если программист её не освободил.
Код:
int x = 0;
Уже не то? Вы создали область памяти и x уже не int, а указатель на место в памяти где находится int, вы понимаете разницу?
BOBAH13 вне форума Ответить с цитированием
Старый 13.08.2011, 11:08   #9
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
вы понимаете разницу?
Вообще-то понимаю.
Но, просто как-то после того как некоторое время интенсивно поработаешь с указателями, с обычными переменными уже как-то не то..
_-Re@l-_ вне форума Ответить с цитированием
Старый 13.08.2011, 11:10   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Вообще-то понимаю.
Но, просто как-то после того как некоторое время интенсивно поработаешь с указателями, с обычными переменными уже как-то не то..
Поменяйте язык это специфика языка, как бы ничего не поделаешь. Хотя вот Qt сделали, но это фреймворк, другая история.
BOBAH13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сборщик мусора в динамическом списке Homutova_Julia Помощь студентам 4 17.06.2011 19:09
Не могу организовать сборщик мусора Homutova_Julia Помощь студентам 5 08.06.2011 13:22
Опрос: Сборщик мусора Пепел Феникса Общие вопросы по программированию, компьютерный форум 15 20.04.2011 19:19
Создание отдельного модуля для класса... Mixim C++ Builder 2 24.04.2010 11:27
Отследить нажатие клавиши для отдельного окна Черничный Win Api 12 13.09.2008 20:47