Reputation: 97938
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
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
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