대규모 라이브러리가 필요하지 않은 괜찮은 shared_ptr 구현?

StackOverflow https://stackoverflow.com/questions/1512520

  •  19-09-2019
  •  | 
  •  

문제

GIS 프로그래밍에서 지금 C ++ 프로그래밍 클래스를 수강하고 있습니다. 나는 적절한 메모리 관리를 다루는 데 많은 두통을 얻기 시작했습니다. 언제든지 3D 행렬에 대한 포인터 또는 다른 매우 큰 8-10 개의 클래스가 종종 8-10 개의 클래스가 있습니다. 이제 우리의 수업은 이미 전문가의 문제를 제기하여 2008 년 C ++ 기능 팩 (TR1)을 사용할 수있게 해주었습니다. 그는 거부했지만 우리가 원한다면 우리가 몇 개의 타사 CPP/HPP 파일을 추가 할 수 있다고 말했다. 나는 이미 Shared_ptr을 부스트에서 벗어나려고 노력했지만 그것은 그 가치보다 두통이 더 많다.

그렇다면 무료 shared_ptr 구현이 있습니까?

도움이 되었습니까?

해결책

부스트를 사용하십시오 BCP 도구. 부스트 라이브러리에서 특정 기능을 추출 할 수 있습니다.

bcp shared_ptr /boost_shared_ptr

shared_ptr을 추출하고 해당 디렉토리에 종속성입니다.

다른 팁

주다 로키스 Ref -Counted Smart Pointer A Shot- 덜 결합 된 것을 기억하는 한 헤더를 강화합니다.

정의가 포함 된 전처리 부스트 헤더 shared_ptr. 단일 .hpp 파일로 작성하십시오. 이렇게하면 향상됩니다 shared_ptr Boost의 전체 설치없이 하나의 헤더 파일의 모든 종속성.

shared_ptr 공유 라이브러리가 코드에 연결되어 있지 않으므로 헤더 전용 라이브러리입니다. 따라서 작동해야합니다.

그것은 그럴 것입니다 끔찍한 프로덕션 솔루션에 대한 아이디어는 크로스 컴파일러, 유연성 및 스레드 안전을 시도하지 않으면 부스트의 다음과 같이 클래스를 위해 자신의 것을 굴리는 것이 너무 어렵지 않습니다.

template <typename contained>
class my_shared_ptr {
public:
   my_shared_ptr() : ptr_(NULL), ref_count_(NULL) { }

   my_shared_ptr(contained * p)
     : ptr_(p), ref_count_(p ? new int : NULL)
   { inc_ref(); }

   my_shared_ptr(const my_shared_ptr& rhs)
     : ptr_(rhs.p), ref_count_(rhs.ref_count_)
   { inc_ref(); }

   ~my_shared_ptr() {
     if(ref_count_ && 0 == dec_ref()) { delete ptr_; delete ref_count_; }
   }
   contained * get() { return ptr_; }
   const contained * get() const { return ptr_; }

   void swap(my_shared_ptr& rhs) // throw()
   {
      std::swap(p, rhs.p);
      std::swap(ref_count_, rhs.ref_count_);
   }

   my_shared_ptr& operator=(const my_shared_ptr& rhs) {
        my_shared_ptr tmp(rhs);
        this->swap(tmp);
        return *this;
   }

   // operator->, operator*, operator void*, use_count
private:
   void inc_ref() {
      if(ref_count_) { ++(*ref_count_); }
   }

   int  dec_ref() {
      return --(*ref_count_);
   }

   contained * ptr_;
   int * ref_count_;
};
#include <tr1/memory> // this is contained in STL.
std::tr1::shared_ptr<A> a = new A;

OW, 방금 교수가 TR1을 사용할 수없는 것을 보았습니다. 힘든 행운.

당신은 정말로 공유 소유권이 필요합니까?

당신은 종종 간단한 임기 hoc raii 클래스로 객체의 독점 소유권을 가져갈 수 있습니다.

Raii가없는 메모리 관리는 고통이지만 당신은 shared_ptr.

방금 코드 샘플에서 심각한 실수를 발견했습니다. 그것은해야한다

ref_count_(p ? new int(0) : NULL)

대신에

ref_count_(p ? new int : NULL)

카운터는 0으로 초기화되어야합니다. 모든 스마트 포인터가 더 이상 똑똑하지 않은 경우. 그 작은 실수를하는 모든 프로그래머는 나중에 디버깅에 많은 비용을 지불합니다. 컴파일러처럼 생각하고 그렇게 행동해야합니다 ....

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