c++ std::使用std::共享指针复制

dbf7pr2w  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(238)
#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();

}

在上面尝试将char*替换为std::shared_ptr<char[]>时,我注意到使用copy会变得有点冗长,从

copy(src.m_name, src.m_name + size, dst.m_name);

copy(src.m_name.get(), src.m_name.get() + size, dst.m_name.get());

有没有比每次都输入.get()更好(更短)的方法?

htrmnn0y

htrmnn0y1#

有没有比每次都输入.get()更好(更短)的方法?
使用智能指针时不会。您最好提前调用.get()并保存指针以供重用,例如:

char *ptr = src.m_name.get();
copy(ptr, ptr + size, dst.m_name.get());

或者,在此特定示例中,您可以使用std::copy_n()代替std::copy(),例如:

copy_n(src.m_name.get(), size, dst.m_name.get());
83qze16e

83qze16e2#

如果你知道std::shared/unique_ptr<char[]>不会立即超出作用域,你可以事先获取一个底层指针并使用它。它使你使用地址的行看起来更整洁,但代价是多出一两行。我个人认为这是值得的。

const char* const src_ptr = src.m_name.get();
char* const dst_ptr = dst.m_name.get();
// assume m_name for either stays in scope until the next line completes
std::copy(src_ptr, src_ptr + size, dst_ptr);

相关问题