2

这基本上是我想做的事情:

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& msg

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

我不确定哪个会更好,似乎有一些回复建议vector<char>改为。(与使用非常相似std::string)。

4

2 回答 2

7

我认为你不需要std::unique_ptrstd::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 中,您可以&buff[0]改用。

于 2013-02-12T19:05:14.507 回答
5

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

我的猜测是 ReadFile 使用缓冲区并且不会将其存储在任何地方 - 因此对于具有该函数的智能指针实际上没有参数。只需传递一个原始指针

buff.get()

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

于 2013-02-12T19:05:40.740 回答