2013-05-24 5 views
3

나는 스마트 포인터와 약간 혼동 스럽다. 다음 코드에서 & 연산자가 스마트 포인터 할당 주소 또는 제어중인 포인터의 주소를 반환해야합니까?C++ 스마트 포인터 주소

코드를 실행하면 다른 주소가 표시됩니다.

main() { 
    int e = 1; 
    int *k = &e; 
    int *l = k; 

    printf("(%p, %p)\n",k,l); 
} 
+2

스마트 포인터가 보유한 포인터를 얻으려면 & i 및 & j 대신 i.get() 및 j.get()을 사용하십시오. – Laserallan

+0

예, 이제 알았습니다. 고맙습니다. 답을 게시하고 싶습니까? –

+1

@Laserallan : 답변입니다. 답변으로 게시 할 수 있습니까? – Asha

답변

2

첫 번째 예에서는 스마트 포인터 개체의 주소가 표시됩니다. 스마트 포인터 내에 포함 된 로우 포인터는 get() 함수를 통해 제공됩니다.

스마트 포인터의 주소 지정은 일반 포인터와 거의 동일하게 작동합니다.

main() { 
    int e = 1; 
    int *k = &e; 
    int *l = k; 

    printf("(%p, %p)\n",&k,&l); // now they're different! 
} 

그리고 당신의 두 번째 예제의 스마트 포인터에 해당이 될 것이다 : 당신의 첫 번째 예제의 원시 포인터에 해당이 될 것

다음
main() { 
    std::shared_ptr<int> i = std::shared_ptr<int>(new int(1)); 
    std::shared_ptr<int> j = i; 
    printf("(%p, %p)\n", i.get(), j.get()); // now they're the same! 
} 
+1

답해 주셔서 감사합니다. 하지만, 공유 포인터에 오버로드 된 것입니까? 왜냐하면 내가 할 수 있기 때문에, 예를 들어 someMethod()와 no (i.get()) -> someMethod() ... –

+0

예, -> 공유 포인터에 의해 오버로드 됨 – kibibu

+0

감사합니다. –

0

원하는 주소를 얻기 위해 표준 : : shared_ptr의의 갔지() 멤버 함수를 호출하십시오 : 나는 원시 포인터와 동등한 코드를 실행하면, 나는 같은 ADRESS를 얻을.

0

, 주요 트릭입니다 평등 연산자 (=)는 다음과 같은 방법으로 정의됩니다.

std::shared_ptr<int> j = i; 

j는 i의 전체 사본이 아닙니다. 그러나 그것은 공유 포인터 i가 보유하고있는 동일한 원시 포인터를 유지할 것이고 따라서 그들의 주소는 다를 것이다.