【问题标题】:How to pass unique_ptr<char[]> to a function to use如何将 unique_ptr<char[]> 传递给要使用的函数
【发布时间】:2013-02-12 19:01:45
【问题描述】:

这基本上是我想做的:

SerialPort::ReadBytes(int32& errcode, Message::string& msg, uint32 num)
{
    DWORD numBytesRead = 0;
    LPDWORD pNumBytesRead = &numBytesRead;
    errcode = 0;        

    std::unique_ptr <char[]> buff (new char[num]);
    // ^^^^ pass this char buffer to the ReadFile function below

    if (!ReadFile(m_sp_pointer,     // Handle to device
            buff,                  // Receives data from device
            num,                    // num bytes to read (in)
            (LPDWORD)pNumBytesRead, // num bytes read (out)
            NULL))
        {
            errcode = GetLastError();
        }

    if (numBytesRead > 0)
    {
        return true;
    }
    return false;
}

我确实知道我没有正确执行此操作,所以我的问题是:我如何正确执行此操作,是否有任何事情使这成为一个坏主意?提前致谢。

编辑:我实际上应该在参数中传入unique_ptr,而不是在本地声明它并传入Message::string&amp; msg

我最初的尝试是通过引用传递Message::string (std::string),所以这也是一个选项.. 即,根本不使用 unique_ptr。在那种的情况下,我会在本地使用常规的char[],然后将msg 的内容设置为char[] 并返回它。

我不确定哪个会更好,似乎很多回复都推荐vector&lt;char&gt;。 (与使用std::string 非常相似)。

【问题讨论】:

  • 我会使用std::vector&lt;char&gt; buff(num);

标签: c++ visual-c++ pointers c++11


【解决方案1】:

我认为你不需要std::unique_ptr。在这种情况下,我更喜欢std::vector

std::vector<char> buff(num);    //and pass buff.data() to function
                                //which accepts char*

if (!ReadFile(m_sp_pointer,               // Handle to device
        buff.data(),                      // Receives data from device
        buff.size(), //(CHANGED THIS TOO) //num bytes to read (in)
        (LPDWORD)pNumBytesRead,           // num bytes read (out)
        NULL))
    {
        errcode = GetLastError();
    }

请注意,std::vector::data() 仅适用于 C++11。在 C++03 中,您可以改用 &amp;buff[0]

【讨论】:

  • unique_ptr&lt;char[]&gt; 的一个优点是它不会不必要地初始化将要被覆盖的数据。
  • @BenjaminLindley 所以在考虑之后,我认为我的问题是:如果我打算返回从 ReadFile 读取的数据、对向量或字符串或 unique_ptr 的引用,哪个更好?
  • @Nawaz,为什么选择向量而不是 std::unique_ptr?
【解决方案2】:

使用智能指针很好,也很有帮助,但在某些情况下,原始指针是正确的选择。

我的猜测是 ReadFile 使用缓冲区并且不将其存储在任何地方 - 所以对于带有函数的智能指针实际上没有参数。只需使用

传递一个原始指针
buff.get()

进一步评论:
使用 unique_ptr outside ReadFile 是有意义的,因为它可以帮助正确处理内存。使用“手动内存管理”,您需要删除从函数返回的每个路径(例如异常)。

【讨论】:

  • Daniel,感谢有关在函数中本地使用常规指针的意见。很好的建议。但是,我确实需要将此数据返回给调用函数并在此之后传递消息。我对原始问题进行了编辑以解决此问题。基本上,我想知道,对于这种情况,他们是偏爱 std::unique_ptr 还是 (std::string/std::vector)?
  • 实际上,我赞成 Nawaz 的回答。我试图提出一个示例,在该示例中,您更喜欢指向数组而不是容器结构的智能指针,但无法做到(也许是其他人?)。我唯一知道的是,您可以将 unique_ptr 转换为 shared_ptr - 在某些情况下这是需要的。
猜你喜欢
  • 2012-03-30
  • 2015-09-03
  • 2019-09-27
  • 2018-03-12
  • 2015-12-22
  • 2014-11-09
  • 1970-01-01
  • 2013-01-16
  • 2023-03-29
相关资源
最近更新 更多