2016-08-23 5 views
0

동적으로 생성 된 싱글 톤 객체를 삭제해야 할 때? 소멸자에서 객체를 명시 적으로 삭제해야합니까? 그렇지 않으면 삭제되지 않은 메모리는 일단 프로그램이 종료되면 OS/시스템에 의해 안전하게 청구됩니다. 삭제되지 않으면 어떤 결과가 발생합니까?동적으로 생성 된 싱글 톤 객체를 삭제해야 할 때?

+0

OS가 메모리를 비우는 시스템에서 프로세스가 종료되면 free가됩니다. 그렇지 않다면 스스로 해방해야합니다. 또한, 싱글 톤 소멸자는 프로세스 종료 전에 필요한 모든 작업을 수행합니까? 그런 다음 개체를 명시 적으로 삭제해야합니다. 또는 당신이 정말로 싱글 톤을 필요로하지 않는 디자인, 특히 동적으로 할당 된 디자인이 아닌 디자인을 생각해보십시오. –

+1

모두 다 다릅니다. 구체적인 문제는 무엇입니까? –

+0

@ Cheersandhth.-Alf 싱글 톤 클래스에는 메모리를 동적으로 할당하고 소멸자에서 삭제하는 멤버 변수 (다른 클래스의 객체)가 있습니다. 하지만 싱글 톤 객체를 명시 적으로 삭제하지는 않습니다. 기본적으로 싱글 톤 객체를 명시 적으로 삭제하거나 삭제하지 않으면 멤버 변수가 어떻게 될지 알고 싶습니다. – Sitesh

답변

1

일반적으로 응용 프로그램이 종료 될 때 개체를 파괴하는 것이 좋습니다. 주석에서 언급했듯이 대부분의 OS는 응용 프로그램이 종료 될 때 메모리를 확보하지만 싱글 톤의 소멸자에서 정리할 필요가 있다면 직접 정리해야합니다 (OS 정리는 소멸자를 호출하지 않습니다) .

보통 응용 프로그램이 종료되기 전에 삭제하지만, 항상 최선의 해결책은 아닙니다. 나는 싱글 톤이 단지 삭제되도록 생성되거나 삭제 후에 액세스되어 재 작성되는 경우가 있음을 발견했다.

싱글 톤을 만들 때 atexit() 함수를 사용하여 정리 기능을 등록 할 수 있습니다. 예를 들면 :

static Singleton* s_instance = nullptr; 

void cleanupSingleton() { 
    delete s_instance; 
} 


class Singleton { 
public: 
    static Singleton* instance() { 
     if(s_instance == nullptr) { 
      s_instance = new Singleton(); 
      std::atexit(cleanupSingleton); 
     } 
     return s_instance; 
    } 
}; 

PS :하지 최고에, 스레드 안전 싱글 예를하지만, 예를 들어 충분.

자세한 내용은 atexit() 기능에 대한 몇 가지 자료를 참조하십시오 : cplusplus.com 또는

1

당신이 싱글 톤을 사용하는 경우 cppreference.com는, 마이어스 '싱글 톤을 사용

class Singleton { 
public: 
    static Singleton& instance() { 
     static Singleton s_instance; 

     return s_instance; 
    } 

    Singleton(const Singleton&) = delete; 
    Singleton& operator=(const Singleton&) = delete; 
private: 
    Singleton() = default; 
    ~Singleton() { /* Your clean up code */ } 
}; 
소멸자가 자동으로 메인이 종료 된 후에 호출됩니다

.