2011-01-12 2 views
0

데모 목적으로이 클래스 고려해질문에 대한) (클래스 인스턴스를 삭제하고 정적 메소드/변수는

class test{ 
private: 
    int y; 
    HANDLE handle; 
    static int x; 

public: 
    test() 
    int add(); 
    static int sub(); 
} 


test::test() { 
    [....] 
    sub = 1; 
    handle = (HANDLE)_beginthreadex(NULL,0,&test::sub,NULL,0,0); 
} 

test::sub() { 
    [....] 
    _endthreadex(0) 
} 

을 내가 정적 메서드/변수에 대한 약간의 확신 그리고 난 지금 몇 가지 질문이있다;

1) test 클래스 인스턴스를 만든 다음 delete test를 호출하면 정적 변수도 정리됩니까? 그렇지 않으면 delete()를 사용하여 소멸자에서 모든 정적 변수를 수동으로 정리해야합니까 (아니면 free()입니까)?

2) thread가 실행 중일 때 _endthreadex로 끝날 때 정적 메소드에서 수행 할 수동 정리가 있습니까? 보시다시피 handle 변수가 스레드를 참조하고 있습니다.

미리 감사드립니다.

답변

4

정적 변수에는 프로그램 수명이 있습니다. 프로그램이 시작될 때 만들어지며 프로그램이 끝날 때 소멸됩니다. 하나만 존재하며 개별 개체에 없습니다.

+0

정적 변수를 클래스에있는 전역 변수로 생각하는 것이 도움이 될 수 있습니다. –

+0

@Michael - 나는 그런 식으로 생각 했었습니다. 그렇다면 수명이 아니라 범위를 지칭하는 전역이 정적 변수가 개인이 될 수 있음을 깨달았습니다. 전역 변수는 고정되어 있기 때문에 (정적 변수는 함수 나 파일에 국한 될 수 있기 때문에) 정적 변수라고 할 수 있습니다. –

+0

마음에 들지 않는 또 다른 한가지 : test() 인스턴스를 삭제하면 'handle'에 대해 CloseHandle()을 호출해야합니까, 아니면 인스턴스의 delete() 중에 자동으로 정리할 수 있습니까? – KaiserJohaan

0

정적 변수는 클래스의 한 인스턴스에서 다른 정적 인스턴스로 지속됩니다. 인스턴스별로 지정하려면 static 키워드를 제거하십시오.

0

static 변수를 할당 해제하려고 시도하지 마십시오. 자신이 이것을 원한다거나 필요로한다면, 실제로는 static을 전혀 사용하고 싶지 않을 것입니다.

0

static intBSS or Uninitialised Data Section에 있기 때문에 다른 사람들이 제안한 것처럼 프로그램의 수명 내내 사용할 수 있습니다.

+0

'BSS 또는 Uninitialised Data Section'과 같은 것은 없습니다. 이것은 구현 세부 사항입니다. '정적 저장 기간'입니다. –

+1

OP는 Windows와 IBM PC 호환 프로그램과 같이 winapi에 대해 언급했습니다 ... 그래서 나는 여전히 내 주장에 맞다고 생각합니까? –

+0

음, ARM의 Windows CE도 WinAPI의 일부를 구현합니다. 아직 PE 형식이므로 초기화되지 않은 데이터 섹션은 실제로 이러한 맥락에서 의미가 있습니다. – MSalters

1

'static'키워드는 메모리에 변수의 인스턴스가 하나만 있고 클래스 테스트에 '속합니다'라는 의미입니다. 'test'의 인스턴스가 사라지 자마자 test :: x 변수가 계속 남아 있고 'test'와 static 'sub'함수의 다른 인스턴스 (private 변수이므로)에서 액세스 할 수 있습니다. 이 단일 인스턴스 만 메모리에 있으므로 정리가 필요하지 않습니다.

static으로 설정하는 이유가 'sub'에서 액세스 할 수있는 경우 매개 변수로 대신 전달할 수 있습니다. 양자 택일로, 당신은 thread 메소드에 'test'인스턴스를 전달할 수 있으며, 객체에서 비 정적 함수를 호출 할 수 있기 때문에 더 이상 정적 일 필요가 없습니다.