std::shared_ptr 运算符[] 等效访问
std::shared_ptr operator [] equivalent access
在 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]
但是,请记住 Nathan 在评论中所说的话。 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().
在 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]
但是,请记住 Nathan 在评论中所说的话。 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().