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::stringstd::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 に答える