共有配列
Shared_array は、shared_ptr に似ています。new[] 演算子によって割り当てられた動的配列をヒープ上にラップします。また、参照カウント メカニズムを使用して、動的配列のプロキシを提供します。プログラムは参照されない限り公開されません。
授業の概要
template<class T>
class shared_array {
public:
explicit shared_array(T * p - 0); //构造函数
template<class D> shared_array(T * p, D d);
~shared_array(); //析构函数
shared_array(shared_array const & r); //拷贝构造函数
shared_array & operator=(shared_array const & r); //拷贝赋值
void reset(T * p = 0); //重置指针
template<class D> void reset(T* p, D d);
T & operator[](std::ptrdiff_t i) const() const; //重载操作符[]
T * get() const; //获得原始指针
bool unique() const; //是否唯一
long use_count() const; //引用计数
void swap(shared_array<T> & b); //交换指针
};
shared_array のインターフェイスと関数は、shared_ptr とほぼ同じですが、主な違いは次のとおりです。
1) コンストラクターによって受け入れられるポインタ p は、new 式の結果ではなく、new[] の結果である必要があります。
2) Operator[] 演算子のオーバーロードは次のとおりです。ただし、要素には通常の配列と同様に添字を使用してアクセスできます。
3) *、->
shared_array は通常のポインターを保持しないため、演算子のオーバーロードはありません。
4) デストラクターは、削除ではなく delete[] を使用してリソースを解放します。
使用法
shared_array は、shared_ptr とscoped_array を組み合わせたものに似ており、shared_ptr の利点とscoped_array の欠点の両方を備えています。shared_ptr とscoped_array に関する議論のほとんどはこれに適しているため、ここでは詳しく説明しませんが、小さな例だけを示します。
#include <boost/smart_ptr.hpp>
using namespace boost;
void case1()
{
int* arr = new int[100]; //一个动态数组
scoped_array<int> sa(p); //shared_array代理动态数组
assert(sa.unique()); //唯一持有指针
shared_array<int> sa2 = sa; //共享数组,引用计数增加
assert(sa2.use_count() == 2); //引用计数增加
sa[0] = 10; //可以使用operator[]访问元素
assert(sa2[0] == 10); //离开作用域,自动删除动态数组
}
また、shared_array のオーバーロードされた Operator[] を使用するときは注意してください。shared_array は配列インデックスの範囲チェックを提供せず、動的配列サイズを超えるインデックスや負のインデックスを使用すると、恐ろしい未定義の動作が発生します。
shared_ptr<std::vector>
Shared_array の機能は限られています。ほとんどの場合、またはで置き換えることができますstd::vector<shared_ptr>
。これら 2 つのソリューションは、より優れたセキュリティと柔軟性を備えており、支払われる代償はほとんど無視できます。
コード例
#include <iostream>
using namespace std;
#include <boost/smart_ptr.hpp>
using namespace boost;
int main()
{
int* p = new int[100];
shared_array<int> sa(p);
assert(sa.unique());
shared_array<int> sa2 = sa;
assert(sa2.use_count() == 2);
sa[0] = 10;
assert(sa2[0] == 10);
}