首页 > 编程语言 > 详细

5种智能指针指向数组的方法| 5 methods for c++ shared_ptr point to an array

时间:2019-12-19 13:24:17      阅读:101      评论:0      收藏:0      [点我收藏+]

本文首发于个人博客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

5种智能指针指向数组的方法| 5 methods for c++ shared_ptr point to an array

原文:https://www.cnblogs.com/kezunlin/p/12067098.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!