2009-09-26 3 views
4

질문 : 내가 프로그램의 범위가 싱글에 대한 소멸자를 작성해야이 (살아 올 때 프로그램이 시작 프로그램이 끝날 때 사망)소멸자에 대한 싱글

세부 사항 : 나는 딜레마에서 오전

on

"싱글 톤 클래스의 소멸자를 작성해야합니까?"

1)이 클래스는 프로그램의 범위 2) 클래스 그래서 시간을 걸릴 것입니다 해제, 힙에 메모리를 많이 사용하고있다

사용자가 프로그램을 종료하면, 응답 빨리해야한다, 왜 시간을 보내고 이 싱글 톤에 의해 점유 된 메모리를 해제하고, 프로그램이 종료됨에 따라 메모리가 해제됩니다.

+0

자격? –

+0

@dribeas : 아마도 프로세스 간 통신에서'wait()'호출의 응답이 빠릅니까? –

답변

3

메모리를 해제하는 데 시간이 오래 걸리는 경우이를 수행하지 마십시오. 이는 특히 메모리를 해제하면 수많은 캐시 누락이 발생하는 경우 크고 시간 소모적 인 문제 일 수 있습니다. 운영 체제가 작업을 수행합니다 (물론 실제로 작동하는 시스템에서 작업하는 경우).

그러나 소멸자가 파일 또는 하드웨어의 잠금을 해제하는 것과 같이 일부 자원의 마무리 작업을 수행하고 "자원 획득이 초기화"를 사용하는 경우 적절한 소멸자가 호출되는지 확인해야합니다 (예 : 정적 객체의 함수는 main() 함수가 반환 된 후에 호출됩니다. 이것은 싱글 톤 내부에 할당 된 객체 중 일부가 리소스를 잠그는 경우에도 적용됩니다! 대부분의 경우

따라서, 실제로 는 개체에 대한 소멸자를 작성하고이 메모리 선택적으로을 해제하게하는 것이 좋습니다. 질문을


SSS는 전혀 소멸자를 작성하지 않기로 결정했다. 그러나, 나는 그것이 더 좋은 해결책이 아니라는 것을 조금 더 논쟁하고 싶습니다.

정적 객체에 대한 메모리를 해제하지 않으면 (정적이라고 함) 상식에 어긋나고 사람들이 일반적으로 프로그램을 작성하는 방식과 모순되는 매우 미묘한 최적화입니다. 메모리를 할당하고 소멸자가없는 코드는 이상한으로 보입니다. 동료들은 수업이 잘못 작성되었다고 생각할 것이고, 다른 수업에있는 동안 버그를 보게 될 것입니다.

대신 C++의 메모리 관리가 정확해야한다는 일반적인 코딩 표준을 따라야합니다. 소멸자를 작성하고 할당 해제하지 않는 것이 중요하다는 것을 보여준 후에 만 ​​호출되지 않도록 코드를 래핑하십시오.

의도하지 않은 메모리를 해제하려면 명시 적이어야합니다.

MySingleton::~MySingleton() 
{ 
#ifndef RELEASE 
    // The memory will be released by OS when program terminates! 
    delete ptr1; 
    delete ptr2; 
#endif 
} 

또는

MySingleton::~MySingleton() 
{ 
    // We don't do anything here. 
    // The memory will be released by OS when program terminates! 
} 

하지만 소멸자가 지속하는 것이 좋습니다.

+0

당신이 옳다 : 는) 소멸자)는 모든 계층 B를 삭제하는 데 시간이 오래 걸리는 그것의 단일 스레드와 그래서 내가 더 잘 사용하기 위해 어떤 소멸자를 작성하지 않기로 결정이있는 모든 자원 finalzing 에 대한 책임을지지 않은 응용 프로그램을 종료하는 동안 경험을 – Satbir

+0

:) 친애하는 파벨, 나는 당신의 생각을 존중하고, 나는 그것이 이상하게 보일 것이라고 동의한다. 나는 이미 아이디어를 따르고있다 "메모리를 해제하지 않으려는 의도는 분명해야한다" 또한 메모리 누수가 발생할 것이다. 하지만 제 2Ghz CPU에서 ~ 300 밀리 초의 향상을 볼 수 있습니다, 그것은 크세논 프로세서가있는 주요 기계에 적은 것입니다. – Satbir

0

당신은 윈도우 OS에서 실행하는 경우 응용 프로그램이

+2

기술적으로 모든 OS는 그렇지만, 필자는 오랫동안 사용해온 윈도우 중 가장 버그가 많은 메모리 관리자임을 지적하고자한다.필자는 이러한 작업에서 실패하는 것을 보았습니다. 최신 Windows 버전에서는별로 좋지 않습니다. – ewanm89

+2

아마 그 주장을 사실로 뒷받침 할 수 있습니까? Windows (2000 이상의 모든 버전)가 메모리를 회수하지 못한 상황의 예를 들려주십시오. 그렇지 않으면 자신의 무지를 퍼 뜨리고 있습니다. – jalf

-2

으로 어쨌든 끝에 해야 릴리스 메모리 운영 체제를 지적 중요하지 않습니다 그래서 이럴 닫을 때, 모든 프로세스에 의해 점유 된 모든 메모리/자원이 재생됩니다 그러나 그것을 관리하기 위해 정말로 신뢰하고 싶습니까? 적어도 명백한 파괴와 함께 버기/나쁘게 설계된 메모리 관리자는 그것을 올바르게 얻을 기회가 더 많습니다.

바로 그걸 얻을 수있는 기회가 두 번 있습니다.

+0

OS에서 지원한다고 가정하면 OS 메모리 관리자를 사용하여 프로세스의 가상 주소 공간을 완전히 파괴 할 수 있습니다. 이것은 C++ freestore 할당 해제와는 다른 개념 레벨에서 발생합니다. – TheFogger

+0

그런 메모리 관리자가 그러한 작업을 수행하지 못한 경우 몇 가지 예를 보았습니다. 이론적으로는 여러 가지 요인에 달려 있습니다. 커널 메모리 관리자는 여러 프로세스간에 공유 메모리가 있는지 걱정하고 있습니다. 버그로 인해 특정 경우에 메모리를 과용 할 수 있습니다. – ewanm89

+0

어쨌든 메모리를 관리하는 사람은 잠재적으로 깨진 커널이 될 수있는 것에 의존하지 않습니다. – ewanm89

2

God Object을 생성하는 것처럼 들리므로 클래스 디자인을 다시 고려하는 것이 좋습니다.

소멸자를 추가할지 여부는 성능 저하가 발생하여 결국 메모리를 다시 할당 할 가치가 있는지 여부에 달려 있습니다.

+1

SSS가 하나님을 믿는다면 왜 안됩니까? ;-) –

+1

나는 분명히 그게 효과가 없을 것이라고 제안하지 않는다. 단지 그를 구하려고 노력하는 것, 또는 앱을 유지할 사람들, 미래의 두통이다. –

2

C++ 언어는 프로그램이 종료 될 때 메모리가 회수 될 것을 보장하지 않지만 반쯤 괜찮은 OS가 문제없이 그것을 수행합니다.

그래서 그래,

  • 경우는 반 괜찮은 OS에서 실행되며,
  • 릴리스 메모리보다해야 할 소멸자는

다음 그래, 당신은 생략 할 수 있습니다 아무것도 없다 소멸자, 메모리 누수, 그리고 운영 체제에 의존하여 정리하십시오.

명백한 단점은 다양한 디버깅 도구가 메모리 누수에 대해 비명을 지르며 소리지를 수 있다는 것입니다.

물론 약간 더 근본적인 질문은 입니다. 왜 그렇게 많은 메모리를 할당하는 싱글 톤을 만드나요?

저에게는 끔찍한 디자인처럼 들립니다.

+0

나는 이것이 끔찍한 디자인이라는 것에 동의하지만, 시스템은 매우 안정하다. 나는 디자인을 변경할 수있는 권한을 얻지 못할 것이다 :) .. – Satbir

+0

그건 공정하다. :) – jalf

2

올바른 방법대로 소멸자를 구현하면 가장 유지 관리가 쉬운 버전이됩니다. 그런 다음 메모리를 할당 해제하는 데 걸리는 시간을 측정 (싱글 톤을 생성하고 종료)하는 실행 파일을 만듭니다.

적절한 삭제 비용에 대한 정확한 사실을 알고 나면 잘못된 코드를 작성하지 마십시오. 측정 가능한 시간이 필요하다면 프로그램 실행 시간과 관련하여 상대적인 척도로 간주하십시오. 대부분의 경우 응용 프로그램에 필요한 처리는 메모리를 확보하는 데 걸리는 시간보다 훨씬 길어집니다.

너무 많은 시간이 필요하다고 생각되면 일반 사용자가 너무 많은 시간을 고려해야하는지, 사용자가 응용 프로그램을 열고 닫은 횟수를 고려해야합니다.

마지막에 너무 많다고 결정하면 나중에 응용 프로그램이 수정되어 싱글 톤이 외부 리소스를 확보 할 수 있으며 파일 잠금을 해제하지 않을 수 있습니다. 이는 파일 잠금이 특히 잘못되었습니다. ..

성능을 위해 정확성을 희생하는 사람들은 '응답이 빨라야한다'에서 '빠른'무엇도