Search code examples
c++shared-ptrunique-ptr

recreate(reassign) a std::shared_ptr or std::unique_ptr


I want to have a managed pointer (unique or shared) and be able to reassign it with new piece of memory and also be sure that old memory is deleted (as it's supposed to be) with managed pointers.

struct MyStruct
{
       MyStruct(signed int) { }
       MyStruct(unsigned float) { }
};
std::unique_ptr<MyStruct> y(new MyStruct(-4)); // int instance
std::shared_ptr<MyStruct> x(new MyStruct(-5));

// do something with x or y
//...


// until now pointers worked as "int" next we want to change it to work as float

x = new MyStruct(4.443);
y = new MyStruct(3.22); // does not work

How would I achieve this in most clean way?


Solution

  • You have several options:

    x = std::unique_ptr<MyStruct>(new MyStruct(4.443));
    x = std::make_unique<MyStruct>(4.443); // C++14
    x.reset(new MyStruct(4.443));
    
    y = std::shared_ptr<MyStruct>(new MyStruct(3.22));
    y = std::make_shared<MyStruct>(3.22);
    y.reset(new MyStruct(3.22));