perreal
perreal

Reputation: 97938

Casting shared_ptr<T> to shared_ptr<void>

I have a structure:

struct Params {
   std::shared_ptr<void> user_data;
   /* ... */
};

I want to use it like this:

int main() {
  std::shared_ptr<SpecializedParams> sp(new SpecializedParams(100));
  Params params;
  /* ... */
  params.user_data = std::static_pointer_cast<void>(sp); 
  /* ... */
  std::shared_ptr<SpecializedParams> sp2 = 
    std::static_pointer_cast<SpecializedParams>(
      params.user_data
    );
  /* ... */
  return 0;
}

Is this valid and safe?

Upvotes: 9

Views: 2095

Answers (2)

Torsten Robitzki
Torsten Robitzki

Reputation: 2555

The code, that actual deletes the shared object is determined when the shared pointer is created (that's why you need a complete type, when constructing the shared_ptr and not, when destructing the shared_ptr). Thus even when your shared_ptr is the last pointer that points to your SpecializedParams object, the object will get correctly destroyed.

Upvotes: 8

ThirdOne
ThirdOne

Reputation: 1248

This should be safe as the void casted item is a shared_ptr too. It will add a reference to the existing element and it will not be released until the void casted item goes away.

Upvotes: 3

Related Questions