智能指针方便了内存的管理,那么怎么来管理一个数组呢?
有两种方式:shared_ptr和unique_ptr。
首先我们介绍一下两中方式的不同:
- shared_ptr不支持下标访问,成员访问只能通过get获取指针后再去访问成员
- shared_ptr定义的数组需要指定deleter,因为shared_ptr的默认deleter是删除管理的对象,但是,使用new[]进行分配内存时,需要用delete [] 而不是delete。
- unique_ptr可以直接使用下标访问,
需要注意的是shared_ptr在c++17已支持.
下面上代码:
shared_ptr
void ArrayDeleter(TestClass *array) {
delete [] array;
}
int main()
{
const size_t size = 100;
//使用函数指定
std::shared_ptr<TestClass []> spFunc(new TestClass[size], ArrayDeleter);
//使用lambda表达式
std::shared_ptr<TestClass []> spLambda(new TestClass[size], [] (TestClass * tc) {
delete [] tc;});
{
//使用默认删除
std::shared_ptr<TestClass []> spDefaultDeleter(new TestClass[size], std::default_delete<TestClass[]>());
(spDefaultDeleter.get())->b = 10;
}
//访问成员
//spFunc[0] = 10; //error
(spFunc.get())->b = 10;
(spFunc.get() + 1)->b = 20;
std::cout << "the first element: " << (spFunc.get())->b << "\n";
std::cout << "the second element: " << (spFunc.get() + 1)->b << "\n";
return 0;
}
unique_ptr
int main()
{
const size_t size = 100;
std::unique_ptr<TestClass []> upFunc(new TestClass[size]);
//访问成员
//(upFunc.get())->b = 10; //error
//(upFunc.get() + 1)->b = 20; //error
upFunc[0].b = 10;
upFunc[1].b = 20;
std::cout << "the first element: " << upFunc[0].b << "\n";
std::cout << "the second element: " << upFunc[1].b << "\n";
return 0;
}