2012-03-29 17 views
5

私はvoid *にデータをキャストする必要があるlibevを使用しています。これはあらかじめ定義された構造体に準拠しています。 boost :: shared_ptrをvoid *にキャストし、void *をboost :: shared_ptrにキャストする必要があります。ここに私のコードはshared_ptrをvoidにキャストする*

void foo(boost::shared_ptr<string>& a_string) 
{ 
void* data = (void*)a_string.get(); 
boost::shared_ptr<string> myString((string*)data); 
} 

が、私はこれが正常に動作しますかなり確信していることを行うことです、しかし方法が私のコードは、私は私の文字列にすべてのshared_ptrの参照が増加しない、この鋳造方法として、スコープの外に行くと信じてセットアップがありますuse_countとshared_ptrはまだ必要な間にメモリを解放しています。

use_countを手動で増減する方法はありますか?理想的には、void *にキャストするときにuse_countをインクリメントし、別の関数にvoid *を渡し、void *をshared_ptrにキャストしてuse_countを減らします。

誰かがこの問題に対する別の解決策を知っていれば、私は助けを使うことができます。

+1

ウォッチャーと 'shared_ptr'の両方を含むクラスにウォッチャーを格納することができます。これにより、ウォッチャーの存続期間が、 'shared_ptr'が所有するオブジェクトの存続期間に一致するか、それを超えることが保証されます。また、pointed-toオブジェクトのアドレスを格納するのではなく、 'shared_ptr'自体のアドレスを格納しないのはなぜですか? – Mankarse

+0

私はshared_ptrを含む構造体を作成し、構造体をvoid *にキャストすることでハックを発見しました。どのように私はこの解決策についてまだ感じるか分からない。また、どこかのフォーラムでshared_ptrのアドレスを使用しないでください。 –

+0

@ user1229962:あなたは 'void * 'を何に渡していますか? –

答えて

4

これを実行してshared_ptrをどこかに割り当てるだけの唯一の方法は、void*にそれを指すように設定します。

0

weak_ptrをお試しください:

shared_ptr<int> p(new int(5)); 
weak_ptr<int> q(p); 

編集:私は適切に質問を読んでいない申し訳ありません。 (その後、コンパイラはa_stringのshared_ptrの破壊を最適化傾けるためあなたの呼び出しの後に変数を参照する場合、弱いポインタが実際に動作することがあります。あなたはそれが

アップデートをクリーンアップされませんので、スコープでそれを維持しようとすることができ

void foo(boost::shared_ptr<string>& a_string) 
{ 
void* data = (void*)a_string.get(); 
boost::shared_ptr<string> myString((string*)data); 
weak_ptr<string> temp(a_string); // prevent destruction before above line 
// or reference a_string in any meaningless way that CANT be optimised out 
// pre-emptively by the compiler 
} 

a_stringまだfoo Dの外のどこかで参照する必要があるかもしれません:あなたは根本的なポインタ

を利用する前に、あなたがこれを行うことができます)>リリース - ので、ゼロにDECRの参照カウントを防ぎますあなたがvoidポインタを使って何をやっているのか(また、新しいコピーを作成したり、空のデータを操作している場合)

+1

weak_ptrはuse_countをインクリメントしないので、メモリは解放されます。 weak_ptrはどのように役立ちますか? –

+1

が私の更新を更新しました。 –

1

boost::shared_ptrにキャストすると、新しい共有ポインタになります。変数`void*が指すメモリを指し示す他の共有ポインタにはリンクされていません。

私があなたがしなければならないと思うのは、そのコードでshared_ptrsを使って考えているクラスにenabled_shared_from_thisサポートを追加することです。

これにより、クラスのメンバ関数(shared_from_this)を介して既存のshared_ptrsと所有権を共有するshared_ptrを取得できます。

詳細はboost enabled_shared_from_this docsを参照してください。

関連する問題