每天一点C++——怎么用智能指针管理数组

智能指针方便了内存的管理,那么怎么来管理一个数组呢?
有两种方式:shared_ptr和unique_ptr。

首先我们介绍一下两中方式的不同:

  1. shared_ptr不支持下标访问,成员访问只能通过get获取指针后再去访问成员
  2. shared_ptr定义的数组需要指定deleter,因为shared_ptr的默认deleter是删除管理的对象,但是,使用new[]进行分配内存时,需要用delete [] 而不是delete。
  3. 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;
}

你可能感兴趣的:(每天一点C++,c++)