我正在尝试使用多个参数,但它不起作用。 这是问题所在的代码,它接受参数。
void CLog::Write(char lvl, char id, const std::string& sMsg, ...)
{
FASSERT(m_pLogger != nullptr);
va_list args;
va_start(args, sMsg);
char szBuf[1024];
vsprintf(szBuf, sMsg.c_str(), args);
va_end(args);
m_pLogger->Write(lvl, id, szBuf);
}
拨打电话时使用此代码
CLog::Write(FLOG_LVL_INFO, FLOG_ID_APP, "Vertices: %u", m_vertices.size() );
此输出
2013-11-30 - 15:02:45 - INFO - Vertices: 3435973836
当我尝试传递更多这样的字符串时
const char * fragment_file_path = "My shader path"; // some path to shader
CLog::Write(FLOG_LVL_INFO, FLOG_ID_APP, "Compiling shader : %s\n", fragment_file_path);
然后程序崩溃并给出了这个
Unhandled exception at 0x560616B3 (msvcr110d.dll) in Fabian.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.
答案 0 :(得分:2)
除了初始化fragment_file_path
之外,va_arg
在其实施中执行sizeof
,sizeof(sMsg)
将sizeof(string)
来确定下一个参数的开始位置堆栈,这是错误的,因为sMsg
是字符串的引用,而不是字符串。
您不能将引用用作varargs的最后一个命名参数;使用值或指针。