【问题标题】:How to set/get unsigned char * to and from std::shared_ptr<uint8_t>?如何在 std::shared_ptr<uint8_t> 之间设置/获取 unsigned char *?
【发布时间】:2017-09-14 10:11:41
【问题描述】:

我想将unsigned char* 数据设置为std::shared_ptr&lt;uint8_t&gt; 并将该指针传递给一个函数,并且在该函数中我想从std::shared_ptr&lt;uint8_t&gt; 获取unsigned char* 数据。

其实我想读取图片数据如下。

FILE *fp=fopen("/data/FR/AjayPatil.jpg","rb");
if(fp)
{
    fseek(fp, 0, SEEK_END);
    data_size=ftell(fp);
    fseek(fp, 0, SEEK_SET);
    jdata=( unsigned char *)malloc(data_size+1);
    if (!jdata)
    {
        fclose(fp);
        return;
    }
    fread(jdata, data_size, 1, fp);
    fclose(fp);
}

如您所见,现在我在jdata 中有数据。 那么如何将这些数据复制到std::shared_ptr&lt;uint8_t&gt; 中呢?

我的图片结构如下。

  typedef struct Image 
  {
       uint16_t width;
       uint16_t height;
       uint8_t depth;
       std::shared_ptr<uint8_t> data;
  }             

成功复制数据后,以下是取回数据的正确方法吗?

     unsigned char *imagedata=data.get(); // here data means std::shared_ptr<uint8_t> data;

【问题讨论】:

  • 为什么你真的需要std::shared_ptrstd::vector&lt;uint8_t&gt; 不够吗?
  • 您不会“将数据复制到指针中”。您将指针指向数据。没有复制步骤。
  • 作为@user0042,你应该使用std::vector
  • 有理由使用uint8_t 吗?您似乎想在两端使用unsigned char
  • @Galik 不一样吗?

标签: c++ c++11 pointers


【解决方案1】:

下面代码中image的数据成员data是一个空的std::shared_ptr&lt;uint8_t&gt;(没有要管理的对象):

Image image;

设置要管理的对象

通过调用std::shared_ptrreset() 成员函数,您可以将托管对象设置为jdata 指向的对象:

image.data.reset(jdata, free);

请注意,您必须提供free 作为删除器,因为jdata 指向的数据是通过malloc 分配的:

jdata=(unsigned char *)malloc(data_size+1);

不提供free 作为删除器 将导致delete(即:默认删除器)在data 的销毁中使用。 p>

获取托管对象

为了获得指向托管对象的指针,您可以调用std::shared_ptrget()成员函数:

auto imagedata=data.get(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 2012-05-13
    • 2013-04-22
    • 2013-09-01
    • 2011-10-23
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多