문제

C ++의 참조는 다음 C 코드를 단순화 할 수있는 수문 구조입니다.

f(object *p){
  //do something
}

int main(){
  object* p = (object*) calloc(sizeof(object));
  f(p);
}

에게

f(object& o){
  //do something
}

int main(){
  object o = object();
  f(o);
}

공유 포인터는 메모리 관리를 단순화하는 C ++의 또 다른 편의성입니다. 그러나 나는 어떻게 통과하는지 잘 모르겠습니다. shared_ptr 같은 함수에 f(object& o) 참조로 인수를 허용하는 것은 무엇입니까?

f(object& o){
  //do something
}

int main(){
  shared_ptr<object> p (new object());
  f(*p);
}

함수를 참조하여 객체가 전달 될 때 공유 포인터가 증가합니까?

도움이 되었습니까?

해결책

가져 가라 shared_ptr 값에 따라 참조 수가 증가합니다. 당신이 더 쉽습니다 typedef 그것:

typedef boost:shared_ptr<object> object_ptr;

void foo(object_ptr obj)
{
    obj->/* stuff*/;
    obj.reset(); //only resets this local copy, that means:
                 // reduce reference count (back to 1), and
                 // set obj to point at null.
}

int main(void)
{
    object_ptr obj(new object());
    foo(obj);
}

참조는 별칭입니다. 참조로 통과 할 때 포인터, 사본 등을 전달하지 않습니다 ... 다른 개체를 별칭하고 있습니다. (실제로 그들은 포인터로 구현됩니다) :

typedef boost:shared_ptr<object> object_ptr;

void foo(object_ptr& obj)
{
    obj.reset(); // the references was never increased, since a copy has not
                 // been made, this *is* obj in main. so the reference 
                 // goes to 0, and obj is deleted
}

int main(void)
{
    object_ptr obj(new object);
    foo(obj); // after this, obj has been reset!
}

항상 기억하십시오 const 오류를 방지하기 위해 수정 :

typedef boost:shared_ptr<object> object_ptr;

void foo(const object_ptr& obj)
{
    obj.reset(); // cannot do! 
}

int main(void)
{
    object_ptr obj(new object);
    foo(obj);
}

외부 증분 및 감소 (및 사본 및 기본)를 피하기 위해 가능한 경우 스마트 포인터를 참조로 전달하는 것을 선호해야한다고 생각합니다.

다른 팁

함수를 참조하여 객체가 전달 될 때 공유 포인터가 증가합니까?

아니요, 원시 포인터에 액세스 한 다음 통과 할 때. 당신은 이것과 비슷한 일을하고 싶습니다.

f(shared_ptr<object> o){
  //do something
}

int main(){
  shared_ptr<object> p (new object());
  f(p);
}
f(object& o){
  //do something
}

int main(){
  shared_ptr<object> p (new object());
  f(*p);
}

함수를 참조하여 객체가 전달 될 때 공유 포인터가 증가합니까?

위의 코드에서 - 아니오. 참조 카운터는 항상 1과 같습니다. 디버거에서 이것을 확인할 수 있습니다. shared_ptr의 참조 카운터는 동일한 개체를 가리키는 shared_ptr 인스턴스의 수를 계산합니다. 그리고 그 이후로는 필요하지 않습니다 범위가 끝날 때까지 살도록 보장되며 함수 호출이 동일한 범위 (또는 더 깊음)에 있습니다. 전체 통화 중에있을 것입니다 에프(). 그래서 모든 것이 괜찮습니다.

...하지 않는 한 에프 당신은 주소를 취합니다 영형 그리고 계속 될 어딘가에 보관하십시오 에프 보고. 이것은 당신이 반드시 피해야합니다 - 당신이 그렇게 해야하는 경우 shared_ptr을 통과하십시오.

가장 먼저 기능적 관점에서 C ++의 참조는 포인터와 정확히 동일합니다. 그들은 언어에 추가 된 이유만이 연산자 과부하의 구문을 더 자연스럽게 만드는 것이 었습니다. (예를 들어, &+& b 대신+b를 쓸 수 있도록)

C 및 C ++ 코드 샘플은 절대적으로 동등하지 않습니다. C ++ 코드의 C 버전은 다음과 같습니다.

f(object *p){
  //do something
}

int main(){
  object o;
  object_constructor(&o);
  f(&o);
  object_destructor(&o);
}

실제로 이것은 C ++ 컴파일러가 개념적으로 생성 할 코드의 종류입니다.

두 번째 질문과 관련하여 : 예, 함수 f를 호출하는 올바른 방법입니다. 공유 포인터 카운터는 증가하지 않습니다. 객체에 대한 실제 포인터는 shared_ptr을 사용하지 않는 것처럼 전달됩니다. 그러나 F가 펑키 한 일을하지 않는 한 안전합니다. F의 매개 변수가 참조 대신 포인터를 사용한 것처럼 똑같은 일이 정확히 일어나고 있음을 기억하십시오. 유일한 차이점은 컴파일러가 명시 적으로 & 연산자를 사용하지 않고도 변수의 주소를 자동으로 전달한다는 것입니다.

나는 개인적으로 참조로 변수를 전달하는 것을 좋아하지 않습니다 (Const에 의해 전달되는 것은 괜찮습니다). 호출 사이트에서 우리가 호출하는 기능이 인수를 수정할 수 있다는 것을 명확하게 만들기 때문에 대신 포인터를 사용하는 것이 좋습니다 (& 기호가 통화 사이트에서 표시되기 때문에).

평화

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top