문제

폭넓게 활용하고 있어요 boost:shared_ptr 내 코드에서.실제로 힙에 할당된 대부분의 개체는 shared_ptr.불행하게도 이것은 내가 통과할 수 없다는 것을 의미한다 this 어떤 함수에든 shared_ptr.다음 코드를 고려해보세요:

void bar(boost::shared_ptr<Foo> pFoo)
{
    ...
}

void Foo::someFunction()
{
    bar(this);
}

여기에는 두 가지 문제가 있습니다.첫째, T* 생성자가 컴파일되지 않습니다. shared_ptr 명시적이다.둘째, 강제로 빌드하면 bar(boost::shared_ptr<Foo>(this)) 나는 결국 이중 삭제로 이어질 내 개체에 대한 두 번째 공유 포인터를 만들 것입니다.

이것은 내 질문으로 이어집니다.해당 개체 중 하나의 메서드 내부에 존재하는 기존 공유 포인터의 복사본을 가져오는 표준 패턴이 있습니까?여기서 유일한 옵션은 침입 참조 계산을 사용하는 것입니까?

도움이 되었습니까?

해결책

당신은 파생 할 수 있습니다 enable_shared_from_this 그런 다음 "this"대신 "shared_from_this ()"를 사용하여 자신의 자기 대상에 대한 공유 포인터를 스폰 할 수 있습니다.

링크의 예 :

#include <boost/enable_shared_from_this.hpp>

class Y: public boost::enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}

멤버 함수에서 스레드를 산란하여 boost :: shared_from_this ()에 바인딩 할 때 좋은 생각입니다. 객체가 해제되지 않도록합니다.

다른 팁

shared_ptr 대신 함수 매개변수에 원시 포인터를 사용하세요.스마트 포인터의 목적은 개체의 수명을 제어하는 ​​것이지만 개체 수명은 이미 C++ 범위 지정 규칙에 의해 보장됩니다.적어도 기능이 종료되는 동안은 존재합니다.즉, 호출 코드는 함수가 반환되기 전에 객체를 삭제할 수 없습니다.따라서 함수 내에서 객체를 삭제하려고 시도하지 않는 한 "멍청한" 포인터의 안전성이 보장됩니다.

shared_ptr을 함수에 전달해야 하는 유일한 경우는 개체의 소유권을 함수에 전달하거나 함수가 포인터의 복사본을 만들도록 할 때입니다.

부스트는이 유스 케이스에 대한 솔루션이 있습니다. enable_shared_from_this

당신은 정말로 Pfoo 내부 바의 더 많은 공유 사본을 만들고 있습니까? 당신이 내부에서 미친 짓을하지 않는다면, 그냥 이것을하십시오.


void bar(Foo &foo)
{
    // ...
}

C ++ 11 shared_ptr 그리고 enable_shared_from_this 현재 표준 라이브러리에 있습니다. 후자는 이름에서 알 수 있듯이이 경우에 정확히 있습니다.

http://en.cppreference.com/w/cpp/memory/shared_ptr

http://en.cppreference.com/w/cpp/memory/enable_shared_from_this

위의 링크에 대한 예제 :

struct Good: std::enable_shared_from_this<Good>{
    std::shared_ptr<Good> getptr() {
        return shared_from_this();
    }
};

사용:

std::shared_ptr<Good> gp1(new Good);
std::shared_ptr<Good> gp2 = gp1->getptr();
std::cout << "gp2.use_count() = " << gp2.use_count() << '\n';

포인터를 수락하는 함수는 두 가지 동작 중 하나를 수행하려고합니다.

  • 대상을 소유하십시오 전달되고 범위를 벗어날 때 삭제합니다. 이 경우 x*를 수락하고 즉시 해당 객체 (기능 본문) 주위에 scoped_ptr를 감을 수 있습니다. 이것은 "이것"또는 일반적으로 힙합 된 물체를 받아들이는 데 효과적입니다.
  • 포인터를 공유하십시오 (그것을 소유하지 마십시오) 통과되는 물체에.이 경우 당신은 그렇게합니다. ~ 아니다 함수 끝에 객체를 삭제하고 싶지 않기 때문에 scoped_ptr을 전혀 사용하고 싶습니다. 이 경우, 이론적으로 원하는 것은 shared_ptr입니다 (다른 곳에서 linked_ptr이라고 불렀습니다). 부스트 라이브러리가 있습니다 shared_ptr의 버전, 그리고 이것은 Scott Meyers의 효과적인 C ++ 책 (3 판의 항목 18)에서도 권장됩니다.

편집하다: 죄송합니다. 질문을 약간 잘못 읽었으며 이제이 답변이 질문을 정확하게 다루지 않는다는 것을 알 수 있습니다. 어쨌든 비슷한 코드를 작업하는 사람에게 도움이 될 수있는 경우 어쨌든 떠날 것입니다.

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