Освобождение памяти атрибутов синглтон-класса - PullRequest
0 голосов
/ 06 сентября 2011

Учитывая следующий класс Singleton, я не освобождаю память в деструкторе.Но экземпляр этого класса останется жизненным циклом программы, как и большинство однотонных классов.Действительно ли важно освобождать память атрибута, кроме восприятия передового опыта?

class Singleton
{
private:
    Singleton() { pbyte1 = new BYTE[100]; }
    ~Singleton() {};
    BYTE* pbyte1;
    static SingletonInstance* pInstance;

    public:

    static Singleton* GetInstance()
    {
        if( pInstace ) return pInstance; 
        else 
        pInstance = new Singleton();
    }
};

Ответы [ 4 ]

3 голосов
/ 06 сентября 2011

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

2 голосов
/ 06 сентября 2011

Зависит от характера ресурсов.Обычно лучшая практика - это , а не , чтобы уничтожить синглтон;разрушение синглтона может привести к порядку проблем деструктора.Исключение составляют случаи, когда синглтон использует ресурсы, которые не будут освобождены системой (например, временные файлы);в этом случае «классической» реализацией функции instance() является:

Singleton& Singleton::instance()
{
    static Singleton theOneAndOnly;
    return theOneAndOnly;
}

В этом случае деструктор theOneAndOnly будет вызываться во время выключения.По этой причине вы должны убедиться, что синглтон никогда не используется в деструкторе статической переменной.

Кстати, ваша реализация также нарушена.Это должно быть:

Singleton& Singleton::instance()
{
    static Singleton* theOneAndOnly = new Singleton;
    return *theOneAndOnly;
}

Это обычное решение.

2 голосов
/ 06 сентября 2011

Как сказал Бьёрн: это важно для отладки.

Это важно и для обслуживания.Программа изменится.Это будет переработано.Если во время рефакторинга синглтон внезапно перестает быть синглтоном, отсутствующий деструктор может вызвать настоящие утечки.Кроме того, в будущем объекту может потребоваться больше памяти (например, дескрипторы БД).Не возвращать их при закрытии программы - это настоящая ошибка.

Так что, если вы хотите получить лучшую практику: Каждый деструктор должен возвращать ресурсы, которыми владеет объект. Это включает деструкторы объектов, где вы моглиполагаться на ОС, чтобы взять их на закрытие программы.

0 голосов
/ 06 сентября 2011

Если экземпляр singleton остается на весь срок службы, не нужно беспокоиться об освобождении ресурсов class.Когда программа завершается, они исчезают (я не имею в виду автоматический delete).

Лучше всего объявлять объекты класса автоматическими при фиксированном размере.

class SingleTon
{
//...
  BYTE pbyte1[100];
//...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...