7. 管理数组

std::unique_ptr可以管理单一对象,也可以管理堆数组:

std::unique_ptr  a(new int[9]);a[0] = 1;

std::unique_ptr这个本事,std::shared_ptr在C++ 17标准之后,可以完美支持,比如:

std::shared_ptr  a(new int[9]); //需17或更高标准

若采用不支持17新标的编译器,该代码也可以编译通过,但释放时采用的是delete,而非delete[ ]。如果你无法使用17新标,可以借助shared_ptr提供的第二个入参,以指定如何释放对象。既然数组需要“delete [ ]”,我们可以提供一个特定的释放动作:

void delete_array(int* p){delete[] p;}

然后将它指定为shared_ptr的第二个参数:

std::shared_ptr  a(new int[9], &delete_array);

虽然解决了释放问题,但在17之前的标准中shared_ptr没有提供针对堆数组所需的“[ ]”操作,因此要访问指定下标的元素,不得不这么写:

//a[0]= 1; 不行,shared_ptr没有重载[]操作符a.get()[0] = 1;//可以,但太丑

用上C++ 17甚至更高标准的编译器,上述烦恼应该就不存在了。