【发布时间】:2016-08-03 21:44:43
【问题描述】:
我正在使用一个库 (GNU MicroHttpDaemon),它通过一个采用 va_list 的回调传递错误消息。我传入一个函数指针,如果发生错误,则使用 va_list 和其他一些参数调用我的函数。我的问题是,当我收到 va_list 它是垃圾并且尝试使用它会导致抛出异常。 我在 Windows 10 上使用 Visual Studio 2015。MicroHttpDaemon 是使用相同的编译器构建的。我对此的最佳猜测是 MicroHttpDaemon 是用 C 编写的,但我使用的是 C++。谁能确认这是问题所在?如果是,那么我可以做些什么来将参数放入我的 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;
}
【问题讨论】:
-
不,我不知道。你能提供一个[MCVE重现你的问题吗?]
-
您为什么要手动管理内存,然后尝试在所有退出路径上释放它?只需使用
std::vector<char>或std::string之一。特别是因为无论如何您都要将其转换为std::string。 -
另外,
va_list被设计为按值传递,当你引用它时可能会出错。你能显示调用它的代码吗? (或者既然是回调,就做函数指针) -
va_list &ap-- 来自 C 的回调不会通过引用传递任何内容。该函数应按值获取列表。 -
我不确定投反对票的目的是什么。也许如果有人(最好是那些给他们的人)可以告诉我,那么我下次可以问一个更好的问题。
标签: c++ c visual-studio variadic-functions