2013-06-06 2 views
0

내가하는 방법이 같은 객체를 생성 new 연산자를 사용하는 경우 :개체를 삭제해야합니까?

void functionA(){ 
    ClassA *a = new ClassA(); 
} 

내가 그것을 해제하려면 다음 코드를 사용해야합니까?

delete a; 

ClassA 객체의 메모리를 자동으로 해제 할 수 있습니까? 함수 A 범위를 다 썼을 때.

나는이

void functionA(){ 
    ClassA a = ClassA(); 
} 

같은 코드를 작성하는 경우는 자동으로 해제 할 수 있습니까?

+6

이것은 좋은 [초급 책] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)에서 답변 된 내용입니다. – GManNickG

+0

C++에 자동 가비지 콜렉션이 없기 때문에 나는 그렇다고 생각한다. – pinkpanther

+0

@pinkpanther, RAII라고 불린다. C++ 11은 GC를 지원합니다. – chris

답변

5

의 경우 :

void functionA() { 
    ClassA *a = new ClassA(); 
} 

당신은 그것을 청소 함수 내에서 delete a;를 배치해야합니다 :

void functionA() { 
    ClassA *a = new ClassA(); 
    // your other code here 
    delete a; 
} 

그렇지 않으면 메모리 누수에 직면하게 될 것이다. 이것은 a 변수를 어떻게 든 반환하거나 그것을 해제하는 다른 장소로 전달하지 않는 한입니다. 대한

: 제대로 소멸자를 정의하면

void functionA(){ 
    ClassA a = ClassA(); 
} 

a 자동으로 '공개'얻을 것이다. ClassA 소멸자에서 제대로 정리하지 않으면 a 내부의 일부 필드가 누출 될 수도 있습니다.

+0

'Class a = ClassA()'의 의미는 OP가 기대하는 것과 거의 틀림 없음을주의하십시오. –

3

해제하려면 다음 코드를 사용해야합니까?

예, 모든 new 수정 된 개체를 출시해야합니다.

ClassA 객체의 메모리를 자동으로 해제 할 수 있습니까? a_ptr이 범위를 벗어나되면 자동으로 realeased됩니다 a_ptr에 할당

#include <memory> 

void functionA(){ 
    std::unique_ptr<ClassA> a_ptr(new ClassA); 
} 

메모리 :

당신은 스마트 포인터를 사용할 수 있습니다.

나는이

void functionA(){ 
    ClassA a = ClassA(); 
} 

같은 코드를 작성하는 경우는 자동으로 해제 할 수 있습니까?

예.

1

자동으로이 작업을 수행 할 std::unique_ptr를 사용할 수 있습니다

void functionA() { 
    std::unique_ptr<ClassA> a(new ClassA()); 
    // don't release 
} 
1

예, 당신은 어떤 동적으로 할당 된 원시 포인터를 삭제해야합니다.범위를 벗어날 때 자동으로 제거하려면 boost 라이브러리의 [shared_ptr] [1] 또는 [unique_ptr] [2] 또는 [scoped_ptr] [3]과 같은 C++ 11 표준에 포함 된 일부 스마트 포인터를 사용할 수 있습니다.

[1]: http://www.cplusplus.com/reference/memory/unique_ptr/ 
[2]: http://www.cplusplus.com/reference/memory/shared_ptr/ 
[3]: http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/scoped_ptr.htm 
3
void functionA(){ 
    ClassA a = ClassA(); 
} 

음, 그 이유를 쓰기? 비효율적이며 혼란스럽고 완전히 불필요합니다. 뭐가 잘못 : 당신이 더 이상 new로 할당 인스턴스를 필요로 할 때 당신이 사용하는 경우

void functionA() { 
    ClassA a; 
} 

가 일반적으로 말하는 new 당신은 delete를 사용하지해야합니다. 예외는 있지만 물론 지금은 걱정할 필요가 없습니다. 지금은 기억하십시오 : 할당 한 경우 new으로 소유하고 있으므로 delete으로 할당을 해제해야합니다.

관련 문제