2016-07-11 2 views
0

저는 원시 포인터가 "악의적 인"소리를 듣기 위해 잠시 동안 C++ 커뮤니티를 돌아 다니며 가능하면 피하는 것이 좋습니다. 원시 포인터를 통해 스마트 포인터를 사용하는 주된 이유 중 하나는 메모리 누수를 "방지"하는 것입니다. 그래서 내 질문은 : 똑똑한 포인터를 사용하는 경우에도 메모리 누수가 여전히 가능합니까? 그렇다면 어떻게 가능할까요?스마트 포인터를 사용하여 메모리 누수가 발생할 수 있음

+1

[**이 질문 **] (http://stackoverflow.com/questions/1826902/how-to -avoid-memory-leak-with-shared-ptr) 흥미 롭습니다. 아마 [** this one **] (http://stackoverflow.com/questions/67174/find-memory-leaks-caused-by-smart-pointers). 둘 다 당신의 일반적인 질문과 직접적으로 관련이 있습니다 (그리고 "스마트 포인터를 사용할 때이 사이트에서 여전히 메모리 유출이 가능합니까?"). – WhozCraig

답변

5

을 누설하지 않는 당신에게 달려?

예, 참고 문헌에주기가 생기지 않도록주의하십시오.

그렇다면 어떻게 가능합니까?

참조 계산 (예 : shared_ptr)에 기반한 스마트 포인터는 객체와 관련된 참조 횟수가 0으로 떨어지면 지적 된 객체를 삭제합니다. 그러나 참조 (A-> B-> A, 또는 좀 더 정교한 사이클)에 사이클이있는 경우 스마트 포인터가 "서로를 생생하게 유지"하기 때문에주기의 참조 카운트가 0으로 떨어지지 않습니다.

다음은 포인터로 shared_ptr을 사용하는 것 외에 메모리를 누출시키는 간단한 프로그램의 예입니다. 실행하면 생성자가 메시지를 인쇄하지만 소멸자는 절대 수행하지 않습니다.

#include <stdio.h> 
#include <memory> 

using namespace std; 

class C 
{ 
public: 
    C() {printf("Constructor for C: this=%p\n", this);} 
    ~C() {printf("Destructor for C: this=%p\n", this);} 

    void setSharedPointer(shared_ptr<C> p) {pC = p;} 

private: 
    shared_ptr<C> pC; 
}; 

int main(int argc, char ** argv) 
{ 
    shared_ptr<C> pC(new C); 
    shared_ptr<C> pD(new C); 

    pC->setSharedPointer(pD); 
    pD->setSharedPointer(pC); 

    return 0; 
} 
+1

'대부분의'스마트 포인터가 의미하는 바가 확실하지 않습니다. C++ 표준에는 두 개가 있고 (스마트 포인터가 아닌 약한 ptr이지만 스마트 포인터를 가져 오는 자리 표시 자), 그 중 하나는 참조 카운터를 사용하지만 다른 하나는 참조하지 않습니다. – SergeyA

+0

고마워. 고마워. –

-1

스마트 포인터에서 메모리를 해제하는 기능이 있습니다. 이 경우 메모리 관리를 중단하라는 스마트 포인터를 요구하고 있습니다. 이 메모리를 누수가 여전히 가능하며, 스마트 포인터를 사용하는 경우 그 후, 그것은 심지어 메모리

관련 문제