2016-08-03 1 views
0

私はva_listをとるコールバックでエラーメッセージを渡すライブラリ(GNU MicroHttpDaemon)を使用しています。私は関数ポインタを渡し、エラーが発生すると、関数はva_listと他のいくつかのパラメータで呼び出されます。私の問題は、va_listを受け取ったときにガベージであり、それを使用しようとすると例外がスローされるということです。 私はWindows 10でVisual Studio 2015を使用しています。MicroHttpDaemonは同じコンパイラでビルドされています。私の考えは、MicroHttpDaemonはC言語で書かれていますが、私はC++を使用しています。誰もがこれが問題であることを確認できますか?それは私のC + +コードに引数を取得するために何ができるのですか? 私のコールバックは、それが何らかの用途のために以下にあります。それは静的メソッドであることに注意してください。だから、一般的にCコールバックとして使うのはいいと思います。va_listはCとC++の間で互換性がありませんか?

void HttpDaemon::parseMessageVa(void * arg, const char * fmt, va_list &ap) 
{ 
    HttpDaemon *daemon = static_cast<HttpDaemon*> (arg); 
    size_t n = vsnprintf(nullptr, 0, fmt, ap); 
    char *buffer = nullptr; 
    try 
    { 
     buffer = new char[n + 1]; 
     vsprintf(buffer, fmt, ap); 
     try 
     { 
      daemon->m_lastMessage = std::string(buffer); 
     } 
     catch (...) 
     { 
      delete[] buffer; 
      throw; 
     } 
    } 
    catch (...) 
    { 
     //buffer allocation failed 
     daemon->m_lastMessage = "Memory allocation failure."; 
    } 
    if(buffer) 
     delete[] buffer; 
} 
+0

いいえ、私が知っているわけではありません。 –

+1

なぜ手動でメモリを管理して、すべての終了パスで解放しようとしているのですか?単に 'std :: vector 'または 'std :: string'のいずれかを使用してください。とにかく、それを 'std :: string'に変換するからです。 –

+1

また、 'va_list'は値渡しに設計されています。あなたが参照するときに何かが間違っているかもしれません。これを呼び出すコードを表示できますか? (またはコールバックであるので、関数ポインタを作成します) –

答えて

4

va_list &ap - Cからのコールバックは参照によって何も渡されません。関数は値でリストを取ります。

関連する問題