C++ shared_ptr和动态数组

论坛 期权论坛 期权     
C语言与C++编程   2019-6-16 21:53   2330   0
作者:apocelipes
链接:https://www.cnblogs.com/apocelipes/p/10346928.html
std::shared_ptr智能指针是c++11一个相当重要的特性,可以极大地将开发者从资源申请/释放的繁重劳动中解放出来。

然而直到c++17前std::shared_ptr都有一个严重的限制,那就是它并不支持动态数组:
  1. #include
  2. std::shared_ptr sp1(new int[10]()); // 错误,c++17前不能传递数组类型作为shared_ptr的模板参数
  3. std::unique_ptr up1(new int[10]()); // ok, unique_ptr对此做了特化
  4. std::shared_ptr sp2(new int[10]()); // 错误,可以编译,但会产生未定义行为,请不要这么做
复制代码
sp1错误的原因很明显,然而sp2的就没有那么好找了,究其原因,是因为std::shared_ptr对非数组类型都使用delete p释放资源,显然这对于new int[10]来说是不对的,对它应该使用delete [] p。

其实c++17前的解决方案并不复杂,我们可以借助std::default_delete,它用于提供对应类型的正确的delete操作:
  1. std::shared_ptr sp3(new int[10](), std::default_delete());
复制代码
现在我们提供了正确的delete操作,可以放心地使用了。

不过这么做的缺点也是很明显的:

  • 我们想管理的值是int[]类型的,然而事实上传给模板参数的是int
  • 需要显示提供delete functor
  • 不能使用std::make_shared,无法保证异常安全
  • c++17前shared_ptr未提供opreator[],所以当需要类似操作时不得不使用sp3.get()[index]的形式

事实上共享一片连续分配内存的需求是极为常见的,所以为了修正上述缺陷,c++17以及即将推出的c++2a对std::shared_ptr做了完善。

先说c++17的改进,shared_ptr增加了opreator[],并可以使用int[]类的数组类型做模板参数,所以sp3的定义可以简化了:
  1. std::shared_ptr sp3(new int[10]());
复制代码
对于访问分配的空间,可以将sp3.get()[index]替换为sp3[index]。看个具体的例子:

[code]#include
#include

int main()
{
    std::shared_ptr sp(new int[5]());
    for (int i = 0; i < 5; ++i) {
        sp = (i+1) * (i+1);
    }

    for (int i = 0; i < 5; ++i) {
        std::cout
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:200
帖子:40
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP