2009-03-24 2 views
34

내 C++ main 함수에서 예를 들어, 스택 메모리 대신 힙 메모리를 사용하는 변수에 대한 포인터가있는 경우 - 응용 프로그램이 종료 된 후 자동으로 할당이 해제됩니까? 나는 그렇게 생각할 것이다.어쨌든 프로그램이 종료 될 때 C++에서 delete를 호출 할 이유가 있습니까?

그래도 종료시 메모리가 자동으로 할당 해제되는 상황에서 절대로 사용되지 않는다고 생각하더라도 항상 힙 할당을 삭제하는 것이 좋습니다.

예를 들어이 작업을 수행하는 데있어 중요한 점이 있습니까?

int main(...) 
{ 
    A* a = new A(); 
    a->DoSomething(); 
    delete a; 
    return 0; 
} 

나는 경우 어쩌면을 생각 나는 리팩토링 (또는 다른 사람 refactors) 그 코드와 delete 정말 neccecary하는 응용 프로그램에 다른 곳을 넣습니다.

Brian R. Bondy (C++의 의미를 구체적으로 설명 함)의 답변뿐만 아니라 Paul Tomblin도 good answer to a C specific question을 가지고 있으며 C++ 소멸자에 대해서도 설명합니다.

+0

언급 된 복제본은 약 C로, C++에서 문제가되는 소멸자에 대한 중요한 정보가 누락되어 있습니다. –

+0

@Brian, 복제본에 대한 나의 대답도 소멸자를 언급합니다 (현재). 이 느낌을 삭제해야한다는 느낌이 여전히 남아 있습니다. –

+0

소멸자에 대해 무슨 뜻인지 확실하지 않으므로 말씀해주십시오. –

답변

61

소멸자에서 실행할 코드가있을 수 있으므로 삭제를 명시 적으로 호출하는 것이 중요합니다. 로그 파일에 데이터를 쓰는 것처럼 말입니다. OS에서 메모리를 비우도록하면 소멸자의 코드가 실행되지 않습니다.

대부분의 운영 체제는 프로그램 종료시 메모리 할당을 해제합니다. 하지만 그것은 스스로를 할당 해제하는 것이 좋습니다. OS 위에서 소멸자를 호출하지 않는다고 말했던 것처럼.

일반적으로 delete를 호출 할 때는 항상 delete를 호출해야합니다. 그렇지 않으면 프로그램에서 메모리 누수가 발생하여 새로운 할당이 실패하게됩니다.

+9

클래스 멤버가 소켓이나 연결 또는 프로그램과 같이 프로그램이 끝날 때 자동으로 사라지지 않는 것을 보유 할 수도 있음을 잊지 마십시오. 메모리 누수가 유일한 것이 아니며 모든 누출을 자동으로 정리할 수있는 것은 아닙니다. –

+0

트리 (특히 trie)와 소멸자 내 메모리를 할당했다면,'delete' 만하면됩니다. 명시 적으로 delete를 호출해야합니까? 또는 나를 위해 할 운영 체제에 의존? –

6

클래스 A을 파괴해야한다고 생각하십시오.
adelete을 호출하지 않으면 해당 소멸자가 호출되지 않습니다. 프로세스가 어쨌든 종료되면 대개 문제가되지 않습니다. 그러나 소멸자가 예를 들어 데이터베이스의 객체들? 캐시를 로그 파일로 플러시합니까? 디스크에 메모리 캐시를 다시 작성 하시겠습니까?

개체를 삭제하는 것이 "좋은 습관"이 아니라 상황에 따라 필요합니다.

7

삭제할 개체가 OS에서 안전하게 해제 할 수없는 외부 리소스를 획득 한 경우를 생각해보십시오. 해당 객체에서 delete를 호출하지 않으면 실제 누수가 발생합니다.

2

항상 직접 삭제해야합니다. 운영 체제가이를 처리하지만 쉽게 피할 수있는 버그를 제외합니다.

21

예, 메모리 누수 탐지 도구를 통해 프로그램을 실행할 때 가양 성을 제거하는 데 도움이됩니다.

+1

몇 가지 좋은 누출 감지 도구의 방향을 알려주십시오. –

+1

Windows에서 Compuware의 BoundsChecker는 우수하지만 비쌉니다. Linux에서 Valgrind에 대한 좋은 소식을 들었지만 아직 시도하지 않았습니다. – Ferruccio

+2

무료로 제공되는 MSVC++는 Visual Leak Detector입니다 (인터넷 검색을 실행하십시오 - 쉽게 찾을 수 있습니다). –

3

명시 적으로 개체를 삭제하는 또 다른 이유는 응용 프로그램에 실제 메모리 누수가있는 경우 귀찮음이 아닌 "누출"을 가려 낼 필요가없는 경우 누출을 찾기 위해 valgrind 같은 도구를 사용하는 것이 더 쉬워집니다 청소 해.

3

삭제할 또 다른 이유는 향후 사용할 수있는 누설 감지기의 잘못된 경보를 피하는 것입니다. 거짓 경보가있는 경우 누출 감지기에서보고 한 실제 누출에주의를 기울이지 않아도됩니다. 누출 감지기가 누출 감지기에보고 한 실제 누출에주의를 기울이지 않아도됩니다.

+1

공평하게 말하면, 영업 코드는 "거짓"경보가 아닐 것입니다.) –

9

예.

  • 표준은 OS가 메모리를 정리할 것을 보장하지 않습니다. 주류 플랫폼에서이를 기대할 수 있지만 기회를 얻는 이유는 무엇입니까?
  • 의도적으로 메모리가 누출되지 않으면 valgrind와 같은 도구에서보고되는 혼란을 최소화하십시오.
  • 이 습관이 생기면 언젠가 실수로이 접근법을 어딘가에 적용하지 않을 것이라고 누가 말합니까?
  • 은 개체 파괴가 필요합니다. 보통 당신이 그렇게한다고 가정합니다. 그것은 당신을 해치지 않습니다.
+1

포인트 3이 가장 매력적입니다. 할당 시도를 삭제하는 것보다 항상 할당을 삭제하는 것이 적정한시기를 항상 결정하는 것이 적습니다. 차 회전 신호를 사용함을 상기시킵니다. 사람들이 왜 때때로 그것을 사용하기를 귀찮게하는지 궁금해했습니다. 당신이 그것을 전혀 생각할 필요가없는 습관을 만드는 것이 낫습니다. – tenfour

+0

@tenfour : 사실. 당신 앞에서 차가 항상 적절할 때를 나타낼 수 있다고 보장 할 수 없다면, 그가 돌지 않을 때 확신 할 수 없습니다. 전체 시스템이 고장났습니다. –

+0

@LightnessRacesinOrbit : "표준은 OS가 메모리를 정리할 것이라고 보장하지 않습니다."라고 말하면 +1입니다. 나는 또한 3 점을 좋아한다. – Destructor

관련 문제