zoukankan      html  css  js  c++  java
  • 5种智能指针指向数组的方法| 5 methods for c++ shared_ptr point to an array

    本文首发于个人博客https://kezunlin.me/post/b82753fc/,欢迎阅读最新内容!

    5 methods for c++ shared_ptr point to an array

    Guide

    shared_ptr

    Prior to C++17, shared_ptr could not be used to manage dynamically allocated arrays. By default, shared_ptr will call delete on the managed object when no more references remain to it. However, when you allocate using new[] you need to call delete[], and not delete, to free the resource.

    In order to correctly use shared_ptr with an array, you must supply a custom deleter.

    code example

    //OK, pointer to int 999
    std::shared_ptr<int> sp(new int(999)); 
    
    
    template< typename T >
    struct array_deleter
    {
      void operator ()( T const * p)
      { 
        delete[] p; 
      }
    };
    
    // pointer to int array, 
    // (1) provide array deleter
    std::shared_ptr<int> sp(new int[10], array_deleter<int>()); 
    
    // (2) or lambda expression 
    std::shared_ptr<int> sp(new int[10], [](int *p) { delete[] p; });
    
    // (3) or use default_delete
    std::shared_ptr<int> sp(new int[10], std::default_delete<int[]>());
    
    // (4) or we can use unique_ptr
    std::unique_ptr<int[]> up(new int[10]); // this will correctly call delete[]
    
    // (5) or we use vector<int>, no need to provide deleter 
    typedef std::vector<int> int_array_t;
    std::shared_ptr<int_array_t> sp(new int_array_t(10));
    
    std::memcpy(sp.get()->data(), arr, size);
    

    std::unique_ptr<int[]> has built-in support for arrays to properly delete[] .

    image buffer

    std::shared_ptr<uchar> pImage(new uchar[length], std::default_delete<uchar[]>());
    memcpy(pImage.get(), (void*)(data.sync_image().data().c_str()), length);
    cv::Mat image = cv::Mat(height, width, CV_8UC3, pImage.get());
    

    Reference

    History

    • 20191012: created.

    Copyright

  • 相关阅读:
    网络技术
    AWS责任共担模型
    AWS 创建新用户(IAM用户)
    AWS系列-申请Redis
    AWS系列-申请MySQL
    MDX之Case When用法
    SSAS中雪花模型
    SSAS中处理时经常出现的几种错误
    C#连接Oracle中文乱码问题解决方法
    BI中PowerDesigner建模
  • 原文地址:https://www.cnblogs.com/kezunlin/p/12067098.html
Copyright © 2011-2022 走看看