2014-12-04 2 views
-3

C++ 스마트 포인터 : 클래스에서 스마트 포인터를 가리키는 포인터를 정의하면 스마트 포인터의 이점을 없앨 수 있습니까?스마트 포인터를 가리키는 포인터를 정의하면 스마트 포인터의 이점을 없앨 수 있습니까?

class TestClass 
{ 
    public SmartPt* ptr1; 
} 

여기 SmartPt 스마트 포인터 클래스는 다음과 같습니다

처럼 (내가 사용의이 종류를 적용 할 말을하지 않았다, 참고).

포인터를 잘 관리하지 않으면 지적한 스마트 포인터도 관리되지 않기 때문입니다.

그렇다면 스마트 포인터를 가리키는 포인터를 사용하는 것이 좋지 않다는 뜻입니까? 이전에 나는 여기에 내가 SmartPt로 교체, MySmartPt을 사용하여, 독자를 방해하지 않으려면

public SmartPt object1; 

[업데이트 1] : 은 그래서 직접처럼, 스마트 포인터를 사용하는 것이 좋습니다.

+3

"스마트 포인터를 가리키는 포인터를 정의하는 방법"코드를 게시 할 수 있습니까? – Eric

+1

스마트 포인터에 이러한 포인터가 필요한 구석이있을 수 있지만 현실적인 응용 프로그램을 생각하는 데 어려움을 겪고 있습니다. 그런 포인터의 사용이 유용하다고 생각한 코드를 보여줄 수 있습니까? – 5gon12eder

+0

@ 5gon12eder, 아니요, 특별히 사용하고 싶지는 않습니다. 코드를 보았고 개정 할 수 있다고 생각합니다. – user1914692

답변

0

아니요, 공유하는 예와 같이 스마트 포인터에 대한 포인터를 사용하지 마십시오.

C++의 스마트 포인터는 * 연산자를 가능한 많이 없애려고하는 RAII 원리를 기반으로합니다. 또한 원시 포인터가 이해할 수없는 복사/할당 오버로드를 사용합니다. 그게이해야 할 내용입니다 있기 때문에, 범위를 벗어나 일단

void * vptr; 
int i = 1346; 

std::shared_ptr<int> sptr = std::make_shared<int>(i); 

vptr = &sptr; 

그런 다음 공유 포인터 자체를 삭제합니다 :이 같은 일을 의미 그렇다면

0

. 스마트 포인터는 포인터에 대한 참조를 유지하지 않으며 데이터에 대한 스마트 포인터의 참조 만 유지합니다. 또한

, 당신은 두 가지 중 delete vptr; 하나를 호출하는 경우가 발생합니다 :

  1. 스마트 포인터가 호출 삭제할했다 매우 화가 될 것입니다.
  2. 스마트 포인터가 범위를 벗어난 경우 vptr이 잘못된 메모리 블록을 가리키고 있습니다.
관련 문제