문제

"C ++ 표준 라이브러리 확장"의 문제가 있습니다.

운동 6
2.4.2 절에서 동일한 포인터에서 두 개의 shared_ptr 객체를 구성해서는 안된다고 말했습니다. 위험은 shared_ptr 객체 나 그 자손이 결국 리소스를 삭제하려고 시도 할 것이며, 이는 일반적으로 문제를 일으킨다는 것입니다. 실제로 조심하면이 작업을 수행 할 수 있습니다. 특히 유용하지는 않지만 동일한 포인터에서 두 개의 shared_ptr 객체를 구성하고 리소스를 한 번만 삭제하는 프로그램을 작성합니다.

아래는 내 대답입니다.

template <typename T>
void nonsence(T*){}
struct SX {
     int data;
     SX(int i = 0) :
              data(i) {
              cout << "SX" << endl;
     }
     ~SX() {
              cout << "~SX" << endl;
     }
};
int main(int argc, char **argv) {
    SX* psx=new SX;
    shared_ptr<SX> sp1(psx),sp2(psx,nonsence<SX>);
    cout<<sp1.use_count()<<endl;
    return 0;
}

그러나 나는 그것이 좋은 해결책이라고 생각하지 않습니다. 왜냐하면 나는 사용 생성자를 통해 그것을 해결하고 싶지 않기 때문입니다. 누구든지 나에게 더 나은 것을 줄 수 있습니까? thx, 내 나쁜 영어를 용서하십시오.

도움이 되었습니까?

해결책 4

다른 팁

두 번째를 구성하기 만하면됩니다 shared_ptr 첫 번째 shared_ptr.

shared_ptr<SX> sp1( new SX );
shared_ptr<SX> sp2( sp1 );

생성 된 SX는 모든 공유 포인터가 파괴 될 때만 올바르게 삭제됩니다.

당신이 찾은 트릭은 쓸모가 없지만 유효합니다. 의 중심 특징 shared_ptr 참조 카운팅입니다. Deleter (두 번째 생성자 인수)는 사용하기위한 것입니다. shared_ptr 다른 자원으로 평범한 포인터. 파일과 함께 사용할 수 있습니다.


typedef boost::shared_ptr FilePtr;
void FileClose( FILE* pf ) { if ( pf ) fclose( pf ); }
FilePtr pfile( fopen( "filename" ), FileClose );

데이터베이스 연결, 소켓 등과 동일하며 raii 일반적으로.

부스트가 어떻게 해결되는지 볼 수 있습니다 shared_from_this. 여기에 있습니다 암호.

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