2011-01-30 3 views
2

난 그냥 아래의 코드는 점에서 올바른지 눈의 신선한 쌍을하고 싶어 포인터 f, g, h.부스트 :: shared_ptr의 의미 (복사)

또한 trifoo의 생성자에서 shared_ptr 복사본의 결과는 무엇입니까? 이것은 shared_ptr을 공유하는 올바른 방법이며, 참조 카운트가 증가하는 것을 보장합니다. 다른 모든 의심은 검증을 테스트 할 수 있었지만 어떻게 확인할 수 있는지 잘 모르겠습니다. 어떤 비판도 환영합니다.

#include <boost/ptr_container/ptr_vector.hpp> 
#include <boost/shared_ptr.hpp> 

class foo { 
    int a, b; 
public: 
    foo(int A, int B) : a(A), b(B) {} 
}; 

typedef boost::shared_ptr<foo> foo_ptr; 

class trifoo { 
    foo_ptr c, d, e; 
public: 
    trifoo(const foo_ptr& C, const foo_ptr& D, const foo_ptr& E) : c(C), d(D), e(E) {} 
}; 

int main() { 
    for (int i = 0; i < 5000000; i++) { 
     foo_ptr f(new foo(1,2)); 
     foo_ptr g(new foo(2,3)); 
     foo_ptr h(new foo(4,5)); 

     boost::ptr_vector<trifoo> tris; 

     tris.push_back(new trifoo(f, g, h)); 
    } 

    return 0; 
} 

참고 : 무의미한 루프는 메모리 누수를 테스트하는 것이었지만 그 중 아무 것도 발생하지 않았습니다.

+1

나에게 잘 보이는. 하지만, 초기화를 위해 초기화 목록을 선호해야하고, 'tris' 벡터는 오직 하나의 요소만을 가질 것이고, 루프에서 빠져 나오기를 원할 것입니다. – GManNickG

+0

간단히 말해 ptr_vector의 기능을 테스트하는 것이 었습니다.이 구현은 실용적인 응용 프로그램이 아닙니다. 감사합니다. – dcousens

답변

6

코드가 기술적으로 정확하다고 보입니다.

shared_ptr 복사의 의미는 참조 된 개체의 참조 횟수가 증가한다는 것입니다. 그냥 작동합니다. 걱정할 것이 없다. 하지만

어떤 스타일의 문제 :

  • 참조에 의해 shared_ptr 전달, 또는 그것을 const 선언은 의미가 없습니다. 항상 복사 할 수 있기 때문입니다. 그냥 shared_ptr 값으로 전달하십시오.

  • 실제로 가능한 경우 할당 대신 생성자 초기화 목록을 사용하십시오.

  • 3 개의 다른 표현을 사용하면 매우 좋습니다. 그것은 예외 안전 함정을 피합니다. 그러나 생성 논리를 팩토리 함수에 넣는 것이 더 좋습니다.

건배 & HTH.,

+0

답변을 주셔서 감사합니다. 공장 기능과 관련하여 방금이 개념에 대해 알았다면 다음과 같은 기능을 갖게됩니다. foo_ptr foo :: makeFooPtr (int a, int b) {return foo_ptr (새로운 foo (a, b)); } 또는 적어도이 줄을 따라 가십시오. – dcousens

+0

사본을 만들면 참조로 저장하지 않습니까? 나는 가치에 의해 그들을 받아 들일 것이고, C++ 03에서 그것들을 내 멤버들로 바꿀 것이다. – GManNickG

+0

이것이 가장 큰 의심이었습니다. shared_ptr이 어떻게 구문 분석되는지 확실하지 않았습니다. 실제로 복사 된 내용에 대한 의미가 분명하지 않았습니다. 참조 카운터가 일관성을 유지할 수 있다고 상상할 수 있습니다. 복사본에 관계없이 동일한 포인터를 가리켜 야합니다. 또한, 어떻게 스왑을 언급 한대로 구현할 수 있습니다. – dcousens