2012-09-14 3 views
16

나는 std::shared_ptr으로 일하고 있으며, 소프트웨어 개발 중에 나는몇 가지를 만났습니다.이 경우 메모리 관리에 의문을 갖습니다. 나는 함수에서 원시 포인터를 주었고 제 코드에서 을 std::shared_ptr (std가 아니라 부스트가 아닌)으로 변환하는 제 3 자 라이브러리를 사용했습니다. 그런데 의 차이점은 무엇입니까?).C++ 원시 포인터와 std :: shared_ptr

공유 포인터가 범위를 벗어나면 이제 어떻게됩니까
ClassA* raw = new ClassA; 
std::shared_ptr<ClassA> shared(raw); 

(의 그것이 함수 에 로컬로 선언되었다 가정 해 봅시다 지금은 기능을 종료하고) : 그럼 나는 다음과 같은 코드가 있다고 가정 해 보자. 원시 포인터가 가리키고 있기 때문에 ClassA 개체가 여전히 존재합니까?

답변

27

아니요. shared_ptr에 포인터를 지정하면 shared_ptr에게 포인터를 삭제할 책임이 있습니다. 그것을 참조하는 마지막 shared_ptr 객체가 더 이상 존재하지 않을 때 이것을 수행합니다. 원시 포인터는 계산되지 않습니다.

+1

왜 shared_ptr은 원시 포인터를 알지 못하기 때문에 shared_ptr은 원시 포인터를 고려하지 않습니다. shared_ptr을 어떻게 구현할 것인가를 생각한다면, 데이터에 대한 원시 포인터가 있는지를 알 수 없다는 것을 알 수 있습니다. – Wutz

+1

+1. 또한,이 때문에'shared_ptr'을 만들 때 같은 줄에 객체를'new'해야합니다. 더 나은, 사용 ['make_shared'] (http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared) –

+0

사실, 원시 포인터가 있는지 알아내는 방법이 없다는 것에 동의합니다. 개체를 가리키는. 이 경우에는 원시 포인터에 대해 위험 할 수 있습니다. 왜냐하면 shared_ptr이 범위를 벗어 났을 때 shared_ptr이 파괴 할 것이기 때문입니다. – ISTB

2

아니요, ClassA 개체가 파괴됩니다. shared_ptr을 범위를 벗어나 복사하지 않은 경우 참조 카운터가 1보다 커야합니다.

5

아니요. 공유 포인터가 그것을 삭제합니다.

포인터를 제공하는 타사 라이브러리가있는 경우 올바른 방법으로 삭제해야합니다. 예를 들어 타사 라이브러리가 'malloc'을 할당 한 경우 lib가 사용하는 '무료'구현을 사용해야합니다. 어떻게 할당되었는지 확인해야합니다.

라이브러리는 제공하는 개체를 파괴 할 수있는 방법을 제공합니까? 어떤 경우에는 그 기능을 사용하여 파괴해야합니다.

관련 문제