私は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;
}
いいえ、私が知っているわけではありません。 –
なぜ手動でメモリを管理して、すべての終了パスで解放しようとしているのですか?単に 'std :: vector'または 'std :: string'のいずれかを使用してください。とにかく、それを 'std :: string'に変換するからです。 –
また、 'va_list'は値渡しに設計されています。あなたが参照するときに何かが間違っているかもしれません。これを呼び出すコードを表示できますか? (またはコールバックであるので、関数ポインタを作成します) –