• 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

  • 相关阅读:
    dubbo-admin 2.0安装部署
    一文多发神器
    springboot整合druid踩坑记录
    thymeleaf中的重定向的绝对路径问题
    路径问题
    sp_executesql介绍和使用
    java.net.UnknownHostException: api.weixin.qq.com解决办法
    调用百度地图示例
    浅析分布式架构
    城乡医保用户角色未分配修改
  • 原文地址:https://www.cnblogs.com/kezunlin/p/12067098.html
Copyright © 2020-2023  润新知