可变参数的原因被破坏/为空

时间:2016-04-27 05:23:07

标签: c++ winapi

我有一个包装函数,它允许我通过编写一行代码而不是3来实现sprintf的结果。

void output(const tstring& format, ...)
{
    va_list args;
    va_start(args, format);

    const int len = _vsctprintf(format.c_str(), args) + 1;
    TCHAR* buf = new TCHAR[len];

    _vstprintf(buf, format.c_str(), args);
    OutputDebugString(buf);

    delete[] buf;
}

我的问题:可变参数已损坏。

例如;

output(_T("%d\n"), 1); // outputs: -858993460
output(_T("%d\n"), 2); // outputs: -858993460

这个错误的原因是什么,我该如何解决?

1 个答案:

答案 0 :(得分:4)

根据C ++标准 [support.runtime] ,在讨论va_start的第二个参数时:

  

参数 parmN 是函数定义的变量参数列表中最右边的参数的标识符(...之前的参数)。 如果参数 parmN 属于引用类型,或者类型与传递没有参数的参数时产生的类型不兼容,则 >行为未确定

强调我的。您的format参数是引用类型,因此它用作...之前的最后一个参数导致未定义的行为。