Проблема удаления объекта “Singleton”.
Проблема удаления объекта “Singleton”.
В приведенной выше реализации класса Singleton, есть метод создания объекта, но отсутствует метод его удаления. Это означает, что программист должен помнить в каком месте программы объект удаляется. Другая проблема, связанная с удалением объекта из памяти, возникает при полиморфном использовании объектов класса. Рассмотрим, например, такой код.
Листинг 5
class Client {
Singleton * _pS;
public:
SetObject(Singleton *p) {_pS=p;}
~Client(){delete _pS;}
};
void main() {
Client c1,c2;
c1.SetObject(Singleton::Instance());
c2.SetObject(Singleton::Instance());
}
Эта программа будет пытаться удалить дважды один и тот же объект, что приведет к исключительной ситуации в программе. При выходе из контекста функции main, сначала будет вызван деструктор объекта c2, который удалит объект класса Singleton, а затем то же самое попытается сделать и деструктор объекта c1. В связи с этим, хотелось бы иметь механизм, позволяющий автоматически отслеживать ссылки на объект класса Singleton, и автоматически удалять его только тогда, когда на объект нет активных ссылок. Для этого используют специальный метод FreeInst(), удаляющий объект только в случае, если активных ссылок на него нет.
Другая задача, которую надо решить – запрет удаления клиентом объекта Singleton посредством оператора delete. Это решается помещением деструктора в секцию protected.Тем самым, клиенту ничего не остается, как использовать пару Instance()/FreeInst() для управления временем жизни объекта.
Листинг 6
class Singleton {
protected:
static Singleton* _self;
static int _refcount;
Singleton(){};
~Singleton(){};
public:
static Singleton* Instance();
void FreeInst() {_refcount--; if(!_refcount) {delete this; _self=NULL;}}
};
В данном примере, в класс Singleton введен счетчик ссылок. Метод FreeInst() вызывает оператор удаления только тогда, когда _refcount равен нулю.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Понятия объекта и экземпляра объекта
Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —
4.11.3. Примеры удаления ipchains-правил
4.11.3. Примеры удаления ipchains-правил Попробуем отменить доступ к FTP на примере удаления записей из цепочки input. Я специально выбрал в качестве образца FTP-сервис, потому что он требует две строки описания, и при совершении операции нужно быть очень внимательным. На вскидку
Понятия объекта и экземпляра объекта
Понятия объекта и экземпляра объекта В начале этой главы мы познакомились с типами данных, определяющими саму природу данных и набор действий, которые можно выполнять с этими данными. Так, строковый тип определяет, что данные этого типа представляют собой строки —
Программы для удаления Spyware и Adware
Программы для удаления Spyware и Adware Незваный гость, как известно, хуже врага – пусть даже он и не пакостит особо, а просто торчит в вашем доме, оттягивая на себя внимание и без конца встревая в вашу жизнь. И хотя те «гости», нет, это не вирусы – хотя по злокозненности наши
Урок 27. Три способа удаления эффекта красных глаз
Урок 27. Три способа удаления эффекта красных глаз Думаю, многим известен эффект красных глаз, зачастую появляющийся на фотографиях. Несомненно, впечатление от кадра он портит, особенно если вы любите показывать свой виртуальный альбом знакомым. Я не буду вам объяснять,
Каскадные обновления и каскадные удаления
Каскадные обновления и каскадные удаления Каскадные обновления и каскадные удаления – весьма полезные свойства процессора баз данных SQL Server. И вот почему.• Каскадные обновления. При изменении значения первичного ключа таблицы связанные данные во внешних ключах,
82. Используйте подходящие идиомы для реального уменьшения емкости контейнера и удаления элементов
82. Используйте подходящие идиомы для реального уменьшения емкости контейнера и удаления элементов РезюмеДля того чтобы действительно избавиться от излишней емкости контейнера, воспользуйтесь трюком с использованием обмена, а для реального удаления элементов из
Шаг 29 - Единственный экземпляр класса - Одиночка или Singleton.
Шаг 29 - Единственный экземпляр класса - Одиночка или Singleton. Как гарантировать единичность экземпляра некоего класса?Предположим, что Вы проектируете программную систему, в которой некое устройство должно быть исключительно в одном экземпляре. Какие у нас варианты?1.
4.4. Обеспечение удаления смахиванием в ячейках табличных видов
4.4. Обеспечение удаления смахиванием в ячейках табличных видов Постановка задачи Необходимо предоставить пользователям приложения возможность без труда удалять строки из табличного
12.5.3. Алгоритмы удаления и подстановки
12.5.3. Алгоритмы удаления и подстановки Рассмотрим последовательность из трех символов: {a,b,c}. Для нее существует шесть различных перестановок: abc, acb, bac, bca, cab и cba, лексикографически упорядоченных на основе оператора “меньше”. Таким образом, abc – это первая перестановка,
Проблема тогда, когда это проблема
Проблема тогда, когда это проблема Не тратьте бесцельно время на проблемы, которых у вас еще нетВам действительно нужно волноваться о вычислениях для 100 000 потребителей сегодня, если это будет у вас через два года?Действительно вам нужно нанять восемь программистов, если
18.5.8. Удаления, выполняемые с помощью редактора sed
18.5.8. Удаления, выполняемые с помощью редактора sed В следующем примере для удаления всех пустых строк применяется потоковый редактор sed. Выходной поток данных направляется в новые файлы с расширением .HOLD. Затем команда mv возвращает файлам их исходные имена.$ pg
Компьютер зависает даже после удаления программы
Компьютер зависает даже после удаления программы Компьютер начал зависать после установки какой– то программы, но после ее удаления он по-прежнему может зависнуть. Вполне вероятно, что не все компоненты программы были удалены. Тогда нужно использовать службу