동적으로 생성 된 싱글 톤 객체를 삭제해야 할 때? 소멸자에서 객체를 명시 적으로 삭제해야합니까? 그렇지 않으면 삭제되지 않은 메모리는 일단 프로그램이 종료되면 OS/시스템에 의해 안전하게 청구됩니다. 삭제되지 않으면 어떤 결과가 발생합니까?동적으로 생성 된 싱글 톤 객체를 삭제해야 할 때?
0
A
답변
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 */ }
};
소멸자가 자동으로 메인이 종료 된 후에 호출됩니다
.
OS가 메모리를 비우는 시스템에서 프로세스가 종료되면 free가됩니다. 그렇지 않다면 스스로 해방해야합니다. 또한, 싱글 톤 소멸자는 프로세스 종료 전에 필요한 모든 작업을 수행합니까? 그런 다음 개체를 명시 적으로 삭제해야합니다. 또는 당신이 정말로 싱글 톤을 필요로하지 않는 디자인, 특히 동적으로 할당 된 디자인이 아닌 디자인을 생각해보십시오. –
모두 다 다릅니다. 구체적인 문제는 무엇입니까? –
@ Cheersandhth.-Alf 싱글 톤 클래스에는 메모리를 동적으로 할당하고 소멸자에서 삭제하는 멤버 변수 (다른 클래스의 객체)가 있습니다. 하지만 싱글 톤 객체를 명시 적으로 삭제하지는 않습니다. 기본적으로 싱글 톤 객체를 명시 적으로 삭제하거나 삭제하지 않으면 멤버 변수가 어떻게 될지 알고 싶습니다. – Sitesh