从原始指针创建共享指针

时间:2017-12-16 08:03:19

标签: c++ shared-ptr

我有以下结构:

struct Message
{
    size_t m_nBytes;
    std::tr1::shared_ptr<char> m_msg; //tr1 since I'm not using c++11

    Message(char* _message, size_t _size);
};

我想有一个构造函数接收一个原始指针作为参数,以便我可以这样使用它:

Message Func()
{
    char myMsg[32] = "This is a message"; 

    Message msg (myMsg, 32);
    return msg;
}

编写构造函数的正确方法是什么? 我应该使用memcpy / std :: copy吗?

Message::Message(char* _message, size_t _size)
: m_nBytes(_size)
, //how to create the shared pointer? 
{
}

由于

更新: 一个。该消息不一定包含字符串。 湾我试图有一个结构将用于c套接字的包装器。所以我想: 一个。 struct holding char *和size 湾处理结构中的内存分配/释放,并允许用户执行上述行为 C。能够从结构中提取char *和大小,以便在read / send,write / recv函数中使用它。

2 个答案:

答案 0 :(得分:1)

为此我会有一个const char* consructor和 copy 文本,因为范围已经拥有本地数组,并且无法转让其所有权

Message::Message(char const* _message, size_t _size)
: m_nBytes(_size)
, m_msg(new char[_size], std::default_delete<char[]>())
{
    std::copy(_message, _message + _size, m_msg.get());
}

如果你想取得原始指针的所有权,我会使用一个表达式的构造函数:

// tells the world you take ownership
Message::Message(std::shared_ptr<char> msg, size_t size)
: m_nBytes(size)
, m_msg(msg)
{
}

注意:因为您指向的是数组,所以需要将数组 deleter std::default_delete<char[]>())传递给std::shared_ptr构造函数。< / p>

答案 1 :(得分:0)

如果对象不会获取内存的所有权(因为您的示例不能),则您的对象必须自己分配内存,然后复制源缓冲区。 至少如果使用c ++ 11编译器,您可以使用委托构造函数,只需要实现一次:

<field name="air_ticket" attrs="{'invisible':['|',('type','!=','remove'),'&amp;',('type','!=','business_task'),('inside_outside','!=',1)],'readonly':[('state','!=','draft')]}"/>
相关问题