我有以下结构:
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函数中使用它。
答案 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'),'&',('type','!=','business_task'),('inside_outside','!=',1)],'readonly':[('state','!=','draft')]}"/>