va_list值始终为-52并使用字符串崩溃

时间:2013-11-30 17:02:11

标签: c++ std variadic-functions

我正在尝试使用多个参数,但它不起作用。 这是问题所在的代码,它接受参数。

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.

我已将代码与其他示例进行了比较,并再次检查va_listvsprintf的引用,但我似乎无法发现错误。

1 个答案:

答案 0 :(得分:2)

除了初始化fragment_file_path之外,va_arg在其实施中执行sizeofsizeof(sMsg)sizeof(string)来确定下一个参数的开始位置堆栈,这是错误的,因为sMsg是字符串的引用,而不是字符串。

您不能将引用用作varargs的最后一个命名参数;使用值或指针。