2013-08-27 4 views
2

У меня есть класс одноплодного следующим образом:Статическая распределяемая память релиз

class myClass 
{ 
public: 
    static myClass* getInstance(); 
    ~myClass(); 

private: 
    static myClass* m_instance; 
protected: 
    myClass(); 
}; 

и выше определение класса:

myClass* myClass::m_instance = 0; 

myClass::myClass() 
{ 
} 

myClass::~myClass() 
{ 
} 

myClass* myClass::getInstance() 
{ 
    if(m_instance == 0) 
    m_instance = new myClass; 
    return m_instance; 
} 

Как известно, когда память выделяется new, она должна чтобы быть выпущенным в кучу, чтобы предотвратить утечку памяти. В моем случае я выделил память, которая не связана с деструктором из-за того, что она статична. Итак, как я могу выделить выделенную память? Я должен вообще освободить его? Не приведет ли это к утечке памяти, поскольку у меня есть объекты других классов, которые также функционируют в main()?

PS: объект, возвращаемый getInstance(), существует в main() до завершения работы приложения.

+0

Или вы можете зарегистрировать функцию функции 'atexit()'. –

+1

Предполагая, что вы работаете на ОС, которая предоставляет отдельное пространство памяти для каждого процесса (то есть практически любой современной ОС в наши дни), «утечка памяти» в этом сценарии несущественна, потому что сразу после возврата main() вся память, был выделен процессом, который в любом случае восстанавливается ОС. Единственный раз, когда это может иметь значение, - если ~ myClass() необходимо выполнить некоторую работу по очистке вне пространства процесса (например, удалить файл из/tmp или что-то еще). Предполагая, что это не так, самым простым решением является просто игнорировать проблему, так как это не вызовет у вас никаких проблем. –

ответ

1

Вы можете использовать смарт-указатель вместо исходного указателя, а затем вы не должны думать об этом :)

Если вы используете C++ 11 вы можете использовать unique_ptr. Если вы используете более старый компилятор, чем используете auto_ptr.

Кроме того, приведенный выше код не является потокобезопасным.

+0

Я использую Qt Я поделился указателем и другими умными указателями в моем распоряжении. – elgolondrino

1

Если объект сохраняется до выключения программы, вам необязательно его освобождать. Однако вы можете захотеть освободить ресурсы (файлы, сокеты, соединения с базой данных и т. Д.), Удерживаемые синглтоном во время отключения; вы можете сделать это со статической функцией «деинициализации», вызванной при нормальном отключении программы.

Кстати, способ инициализации синглтона не является потокобезопасным. Вместо этого вы можете использовать threadsafe singleton.

1

В этом случае вам нужно будет удалить свой объект с помощью указателя в главном (или там, где у вас есть доступ к нему до его выхода из области видимости).

Что-то вроде:

int main() 
{ 
    myClass* inst = myClass::getInstance(); 
    // ... do something with it here 
    delete inst; 
} 

Хотя это, как правило, плохая практика, потому что вы не должны иметь новый/удалить «дичает» где-нибудь в вашей программе. Лучше придерживаться концепции RAII и связывать свою память с кучей с некоторыми объектами в стеке с помощью конструкторов и деструкторов.

В этом конкретном случае - вместо использования «нового mClass» в «getInstance()» вы можете просто объявить m_instance статическим.

myClass& myClass::getInstance() 
{ 
    static myClass instance; 
    return instance; 
} 

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

Смежные вопросы