Używam libev, który wymaga przesyłania moich danych do pustki *, aby zachować ich predefiniowane struktury. Muszę rzucić boost :: shared_ptr do void *, a następnie odrzucić void * z powrotem do boost :: shared_ptr. Oto mój kod to zrobićZwiększenie rzutowania shared_ptr do void *
void foo(boost::shared_ptr<string>& a_string)
{
void* data = (void*)a_string.get();
boost::shared_ptr<string> myString((string*)data);
}
Jestem całkiem pewien, że to działa dobrze, jednak sposób, w jaki mój kod jest ustawiony wierzę wszystkie odniesienia shared_ptr do mojego ciąg będą poza zakresem tej metody odlewania jak nie zwiększy use_count, a tym samym shared_ptr, zwalnia pamięć, gdy wciąż jej potrzebuję.
Czy istnieje sposób na ręczne zwiększenie/zmniejszenie wartości użytkowej? Idealnie zwiększyłbym use_count, gdy rzucę do pustki *, przekazuję moją pustkę * do innej funkcji, odrzuć pustkę * z powrotem do shared_ptr i zmniejsz wartość use_count.
Jeśli ktoś zna inne rozwiązanie tego problemu, mógłbym skorzystać z pomocy.
Można przechowywać watcher w klasie, która zawiera zarówno watcher i 'shared_ptr'. Zapewni to, że czas życia obserwatora zostanie dopasowany lub przekroczony przez czas życia obiektu posiadanego przez 'shared_ptr'. Dlaczego nie przechowywać adresu samego 'shared_ptr' zamiast zapisywać adres wskazanego obiektu? – Mankarse
Znalazłem hack around przez tworzenie struct, który zawiera shared_ptr i rzutowanie struct do void *. Nie jestem pewien, co sądzę o tym rozwiązaniu.Ponadto na forum zobaczyłem, że nie powinieneś używać adresu shared_ptr. –
@ user1229962: Co przekazujesz 'void *' do? –