4

私はこれらの行を持っています:

typedef boost::shared_ptr<A> A_SPtr;
void *f(void* var){ ...

そして、私はこのようなことができるようになりたい:

A_SPtr instance = (void*)(var);

どうすればできますか?また、shared_ptr から void* への意味を逆にキャストするにはどうすればよいですか?

4

2 に答える 2

6

へのおよびからの共有ポインタへのポインタをキャストするだけvoid *です。

  1. shared_ptrvoid *:

    f (reinterpret_cast<void *>;(&A_SPtr));
    
  2. void *戻るshared_ptr:

    A_SPtr instance = * reinterpret_cast(boost::shared_ptr<A>*)(var);
    

注意:これにより、共有ポインタへのポインタがスレッドに渡されます。これは、共有ポインターがスレッド関数の存続期間を通じて存在しない場合は機能しません。そうでない場合、スレッドは、存在しなくなったオブジェクトへのポインター (共有ポインター) を持つことになります。その要件を満たすことができない場合は、新しいshared_ptrへのポインターを渡しdelete、スレッドの処理が完了したときにそれを渡します。(またはboost:bind、共有ポインターを直接操作する which を使用します。)

于 2012-07-27T17:54:42.097 に答える
0

void*f で渡されたの所有権を仮定しても問題がなく、void*が実際にオブジェクトを参照していて、Aクリーンアップの正しい方法を知っている限り、先に進んでスマートな所有権を引き継ぐためのポインタ:

typedef boost::shared_ptr<A> A_SPtr;

void *f(void *var){
    A_SPtr instance(static_cast<A*>(var));
}

編集:質問からは明らかではありませんが、いくつかのコメントは、実際に使用する「汎用」インターフェースを介してスマートポインターを渡そうとしていることを示していますvoid*。これは、任意のタイプで行うのと同じ方法で行います。

void *f(void *var){
    A_SPtr *instance = static_cast<A_SPtr *>(var);
}

そして、次のようにポインターを渡します。

A_SPtr a;
f(&a);

f他のポインターと同様に、ポインターを受け取ったときにポインターが有効であるためには、オブジェクトの有効期間が十分であることを確認する必要があります。

于 2012-07-27T18:16:20.147 に答える