配列スマートポインターの制限事項
- スマートポインタ配列、無しunique_ptrを
*
及び->
動作が、添字演算子をサポート[]。 - スマートポインタ配列をshared_ptrの存在
*
及び->
] [動作が、添字演算子をサポートしていない、のみとすることができるget()
配列の要素にアクセスします。 - shared_ptr配列のスマートポインターをカスタマイズする必要があります。
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class test{
public:
explicit test(int d = 0) : data(d){cout << "new" << data << endl;}
~test(){cout << "del" << data << endl;}
void fun(){cout << data << endl;}
public:
int data;
};
unique_ptrおよび配列:
int main()
{
unique_ptr<test[]> up(new test[2]);
up[0].data = 1;
up[1].data = 2;
up[0].fun();
up[1].fun();
return 0;
}
shared_ptrと配列:
int main()
{
shared_ptr<test[]> sp(new test[2], [](test *p) { delete[] p; });
(sp.get())->data = 2;
(sp.get()+1)->data = 3;
(sp.get())->fun();
(sp.get()+1)->fun();
return 0;
}
配列メソッドへの5つのスマートポインター
- shared_ptrおよびdeleter(関数オブジェクト)
template<typename T>
struct array_deleter {
void operator()(T const* p)
{
delete[] p;
}
};
std::shared_ptr<int> sp(new int[10], array_deleter<int>());
- shared_ptrおよびdeleter(ラムダ式)
std::shared_ptr<int> sp(new int[10], [](int* p) {delete[]p; });
- shared_ptrとdeleter(std :: default_delete)
std::shared_ptr<int> sp(new int[10], std::default_delete<int[]>());
- unique_ptrを使用する
std::unique_ptr<int[]> up(new int[10]); //@ unique_ptr 会自动调用 delete[]
- 使用する
vector<int>
typedef std::vector<int> iarray;
std::shared_ptr<iarray> sp(new iarray(10));