std :: shared_ptr operator []等效访问

时间:2016-12-14 14:54:07

标签: c++ pointers smart-pointers

在C ++中,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];

2 个答案:

答案 0 :(得分:9)

像这样:

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());

答案 1 :(得分:0)

改为使用shared_ptr<std::array<unsigned char, 10>>

或者shared_ptr<std::basic_string<unsigned char>>,如果您需要动态选择尺寸。

对于现代C ++,没有充分的理由使用新数组,删除数组或裸数组。如果您需要它们以实现兼容性,则始终有.data()。