2010-08-21 3 views
1

임베디드 시스템에서 응용 프로그램을 계속 실행해야합니다. 이 응용 프로그램을 구현하는 동안 Heap에서 많은 메모리를 할당해야합니다. 그 사람들을 위해 auto_ptr을 사용하면 언제 해제 될까요? 내 이해에 따라, 자동 포인터로 지적 된 메모리는 응용 프로그램을 종료하거나 종료 할 때 해제됩니다. 신청서가 종료되지 않으면 자동으로 해제되지 않습니다. reset()을 사용하여 아래와 같은 메모리를 확보 할 수 있습니다.응용 프로그램을 종료하지 않을 경우 auto_ptr 누출로 인해 메모리가 가리 킵니까?

auto_ptr<Test> testPtr(new Test); 
testPtr.reset(); 

그러나 이렇게하면 auto_ptr의 목적이 무너질 수 있습니다. 내가 모든 장소에서 reset()을 할 수 있다면, 나는 모든 장소에서도 delete를 할 수있다.

Pls는 응용 프로그램이 종료되지 않아도 auto_ptr이 가리키는 메모리가 해제되는지 여부를 알려줍니다. 그렇지 않다면, reset()을 호출하는 것 외에 다른 방법으로 메모리를 확보 할 수 있습니까?

편집 : 내 경우에는 auto_ptr 클래스 내에 있습니다. 이 클래스 객체는 응용 프로그램을 종료 할 때만 파기됩니다. 응용 프로그램이 무한대로 실행되므로 클래스 객체가 파괴되지 않습니다. 그러므로 문제. Pls도 이것을 고려합니다.

편집 : 답변 : 다른 개체를 저장하기 위해 동일한 auto_ptr을 사용하고 있기 때문에 매번 할당 할 때 auto_ptr 할당 연산자가 이전 개체 삭제를 처리합니다. 리셋을 요구하지 않아도 누출이 없습니다.

+0

이것은 auto_ptr 인스턴스가 포함 된 클래스의 디자인에 문제가있는 것으로 보입니다. auto_ptr 인스턴스에 할당 된 힙 메모리의 수명 기간에 대한 규칙을 설명하면 도움이 될 것입니다. – Henk

답변

3

auto_ptr이 가리키는 메모리는 auto_ptr 인스턴스가 삭제 될 때 해제됩니다. 함수에 정의 된 로컬 auto_ptr 인스턴스의 경우 함수가 종료 될 때 발생합니다. auto_ptr 인스턴스가 클래스 멤버 인 경우, 컨테이너 클래스 인스턴스가 파기되면 파기됩니다. 전역 auto_ptr 인스턴스는 프로그램이 종료 될 때 소멸됩니다.

+0

@Alex : 내 경우 auto_ptr은 클래스 안에 있습니다. 이 클래스 객체는 응용 프로그램을 종료 할 때만 파기됩니다. 응용 프로그램이 무한대로 실행되므로 클래스 객체가 파괴되지 않습니다. 그러므로 문제. – bjskishore123

+0

@bj : 그 때 무슨 문제가 있습니까? 클래스는 프로그램이 종료 될 때까지 자원을 필요로합니다. 변경할 것이 없습니다. – GManNickG

+0

@GMan : 일부 외부 이벤트가 응용 프로그램에 도달 할 때마다 auto_ptr을 새로운 객체로 지정하고 싶습니다. 그래서 나는 다시 설정()을하고 포인터를 다시 사용해야한다고 생각한다. – bjskishore123

4

auto_ptr 당신에게 두 가지를 제공합니다

  1. 할당 전송 소유권 소유 auto_ptr은가 파괴
  2. 을, 그래서에만 해당됩니다 응용 프로그램이 종료가

를 소유하는 데이터입니다/때 경우 당신은 전역 auto_ptr 객체를 가지고 있습니다. 동적으로 할당 된 객체를 참조하는 전역 auto_ptr은 대개 객체 자체를 전역으로 만듦으로써 대체 할 수 있습니다 (그러나 일반적으로 두 가지를 모두 피하기를 원합니다).

일반적으로 auto_ptr을 사용하는 경우 응용 프로그램을 종료하면 관련이 없습니다. auto_ptr이 정의 된 범위에서 종료됩니다. 그 시점에서 소유하고있는 객체가 삭제됩니다.

0

auto_ptr 클래스의 소멸자는 생성자를 호출 할 때 지정한 포인터 (예 : new Test)에서 delete 연산자를 호출합니다. auto_ptr::reset()을 호출해도 같은 효과가 있습니다.

범위 규칙을 사용하여 auto_ptr 인스턴스가 가리키는 개체의 삭제를 자동화 할 수 있다는 이점이 있습니다.

예제에서 testPtr은 스택에서 인스턴스화 중이며 일단 범위를 벗어나면 소멸됩니다.분명 당신이 범위를 사용하여 귀찮게하지 않은 수 (즉, {}) 다만이 방법이 존재 작업의 이점이 내가 * 하지만을 표시 auto_ptr::reset()라고 지금

void foo() 
{ 
    //... do some work 

    { 
    auto_ptr<Test> testPtr(new Test); 

    //... do something with testPtr 

    } // *at this point testPtr is no longer in scope and the pointer held by this object 
    // will be deleted 

    //... do some additional work 
} 

:

이 예제를 고려 예외 및 return 진술 등등.

관련 문제