std :: shared_ptr operator []等效访问



in C 17 std::shared_ptr具有operator [],可以允许基于索引向量的指针(http://en.cppreference.com/w/cpp/memory/memory/shared_ptr/operator_at/P>

如果无法使用此类操作员,我如何获得类似的访问,并且我仍然想将智能指针用于一系列元素,例如:

std::shared_ptr<unsigned char> data;
data.reset(new unsigned char[10]>;
// use data[3];

这样:

data.get()[3]

但是,请记住内森在评论中所说的话。对于由new[]分配的指针而言,std::shared_ptr<unsigned char>的默认代码是错误的。您将需要使用适当的deleter使用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 ,没有充分的理由使用新的,删除或裸阵列。如果您需要它们以兼容,则总会有.data()。

相关内容

  • 没有找到相关文章

最新更新