这基本上就是我想做的事情:
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
非常相似。)
答案 0 :(得分:7)
我认为你不需要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中,您可以使用&buff[0]
代替。
答案 1 :(得分:5)
使用智能指针很好并且非常有用,但有些情况下原始指针是正确的选择。
我的猜测是,ReadFile使用缓冲区并且不会将其存储在任何地方 - 因此,对于具有该功能的智能指针,实际上并没有参数。用
表示原始指针buff.get()
进一步评论:
使用unique_ptr 外部 ReadFile是有意义的,因为它可以帮助正确处理内存。使用“手动内存管理”,您需要删除从函数返回的每个路径(例如,异常)。