#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()
更好(更短)的方法?
2条答案
按热度按时间htrmnn0y1#
有没有比每次都输入
.get()
更好(更短)的方法?使用智能指针时不会。您最好提前调用
.get()
并保存指针以供重用,例如:或者,在此特定示例中,您可以使用
std::copy_n()
代替std::copy()
,例如:83qze16e2#
如果你知道
std::shared/unique_ptr<char[]>
不会立即超出作用域,你可以事先获取一个底层指针并使用它。它使你使用地址的行看起来更整洁,但代价是多出一两行。我个人认为这是值得的。