2

基本的に、ポインタ/アドレスセマンティクスとすぐに同等ではない特定のリソース(整数インデックスなど)を参照カウントする必要があります。基本的に、リソースを回して、カウントがゼロに達したときに特定のカスタム関数を呼び出す必要があります。また、リソースへの読み取り/書き込みアクセスの方法は、単純なポインターの参照解除操作ではなく、より複雑なものです。boost :: shared_ptrがここでの法案に適合するとは思いませんが、使用する可能性のある他のBoostと同等のクラスが欠落している可能性がありますか?

私がする必要があることの例:

struct NonPointerResource
{
   NonPointerResource(int a) : rec(a) {} 

   int rec;
}

int createResource ()
{
   data BasicResource("get/resource");
   boost::shared_resource< MonPointerResource > r( BasicResource.getId() , 
    boost::function< BasicResource::RemoveId >() );
   TypicalUsage( r );
}  
//when r goes out of scope, it will call BasicResource::RemoveId( NonPointerResource& ) or something similar


int TypicalUsage( boost::shared_resource< NonPointerResource > r )
{
   data* d = access_object( r );
   // do something with d
}
4

3 に答える 3

5

ヒープにNonPointerResourceを割り当て、通常どおりデストラクタを割り当てます。

于 2011-02-20T14:19:22.617 に答える
4

たぶんboost::intrusive_ptrは法案に合うかもしれません。これが、コードの一部で使用しているRefCounted基本クラスと補助関数です。代わりに、delete ptr必要な操作を指定できます。

struct RefCounted {
    int refCount;

    RefCounted() : refCount(0) {}
    virtual ~RefCounted() { assert(refCount==0); }
};

// boost::intrusive_ptr expects the following functions to be defined:
inline
void intrusive_ptr_add_ref(RefCounted* ptr) { ++ptr->refCount; }

inline
void intrusive_ptr_release(RefCounted* ptr) { if (!--ptr->refCount) delete ptr; }

それが整っていると、あなたはそれから持つことができます

boost::intrusive_ptr<DerivedFromRefCounted> myResource = ...
于 2011-02-20T14:40:26.227 に答える
1

shared_ptr<void>これは、カウントされたハンドルとして の使用に関する小さな例です。
適切な作成/削除機能を準備すること で、ある意味で任意のリソースハンドルshared_ptr<void>として使用できるようになります。 ただし、ご覧のとおり、これは弱い型付けであるため、使用するとある程度不便になります...

于 2011-02-20T21:26:36.683 に答える