在C ++ 17中,std::shared_ptr
有一个operator []
,允许索引基于矢量的指针(http://en.cppreference.com/w/cpp/memory/shared_ptr/operator_at)
如果这样的操作符不可用,我如何获得类似的访问,我仍然想要使用智能指针来获取元素数组,例如:
std::shared_ptr<unsigned char> data;
data.reset(new unsigned char[10]>;
// use data[3];
像这样:
data.get()[3]
但是,请记住内森在评论中所说的话。对于由std::shared_ptr<unsigned char>
分配的指针,new[]
的默认删除器是错误的。你需要使用std::shared_ptr::reset(Y* ptr, Deleter d);
和一个合适的删除器:
data.reset(new unsigned char[10], [](auto p){ delete[] p; });
或者,如果你不喜欢lambda的丑陋,你可以定义一个可重用的帮助器:
struct array_deleter {
template<typename T> void operator()(const T* p) {
delete[] p;
}
};
// ...
data.reset(new unsigned char[10], array_deleter());
请改用shared_ptr<std::array<unsigned char, 10>>
。
或者shared_ptr<std::basic_string<unsigned char>>
,如果你需要动态选择的大小。
使用现代C ++,没有充分的理由使用new,delete或naked数组。如果你需要兼容性,总会有.data()。