#include <iostream>
struct Data
{
    std::shared_ptr<char[]> m_name = nullptr;  // char* m_name = nullptr;
//    bool m_owner = false;
    Data() = default;
    Data(const char* name)
    {
        using std::copy;
        int size = strlen(name) + 1;
        m_name = std::make_unique<char[]>(size); // m_name = new char[size];
        copy(name, name + size, m_name.get());
//        m_owner = true;
    }
//    ~Data()
//    {
//        if (/*m_name &&*/ m_owner)
//            delete[] m_name;
//        m_name = nullptr;
//    }
    void print()
    {
        using std::cout, std::endl;
        if (!m_name)
            return;
        int size = strlen(m_name.get());
        for(int i = 0; i < size; ++i)
            cout << m_name[i];
        cout << endl;
    }
};
void shallow_copy(Data& dst, Data& src)
{
    dst.m_name = src.m_name;
}
void deep_copy(Data& dst, Data& src)
{
    using std::copy;
    int size = strlen(src.m_name.get())+1;
    dst.m_name = std::make_unique<char[]>(size); // dst.m_name = new char[size];
    copy(src.m_name.get(), src.m_name.get() + size, dst.m_name.get());
//    dst.m_owner = true;
}
int main()
{
    using std::cout, std::endl;
    cout << "starting..." << endl;
    auto data1 = new Data{"abc"};
    data1->print();
    auto data2 = new Data();
    data2->print();
//    shallow_copy(*data2, *data1);
    deep_copy(*data2, *data1);
//    delete data1;
    data2->print();
}
While trying to replace char* by std::shared_ptr<char[]> above, I noticed things get a little more verbose with copy, going from
copy(src.m_name, src.m_name + size, dst.m_name);
to
copy(src.m_name.get(), src.m_name.get() + size, dst.m_name.get());
Is there a better (shorter) way than typing that .get() every time?
 
     
    