C++ 为什么_vsnprintf会导致错误

C++ 为什么_vsnprintf会导致错误,c++,C++,我有这样一个帮助功能: wchar* CHelpTool::PrintfToWstrFromStr( const char *content, ... ) { va_list argp; va_start(argp, content); int nLenstr = strlen(content); char* pstrNum = (char*)MALLOC(nLenstr+50); LOG("PrintfToWstrFromStr111111111111

我有这样一个帮助功能:

wchar* CHelpTool::PrintfToWstrFromStr( const char *content, ... )
{
    va_list argp;
    va_start(argp, content);
    int nLenstr = strlen(content);
    char*  pstrNum = (char*)MALLOC(nLenstr+50);
    LOG("PrintfToWstrFromStr11111111111111111111111111111111111111111111");
    LOG("PrintfToWstrFromStr    pstrNum ====================================%s", pstrNum);
    LOG("PrintfToWstrFromStr    nLenstr ====================================%d", nLenstr);
    LOG("PrintfToWstrFromStr    content ====================================%s", content);
    _vsnprintf(pstrNum, nLenstr+50-1, content, argp);
    LOG("PrintfToWstrFromStr2222222222222222222222222222222222222222222222");
    AECHAR* wpstrNum = CHelpTool::StrToWstr(pstrNum);
    FREEIF(pstrNum);
    va_end(argp);

    return wpstrNum;
}
当涉及到
\u vsnprintf
时,程序将崩溃。
日志是:

pstrNum ====================================  
nLenstr ====================================68  
content ====================================Gi?m phòng ??ch, t?ng %d%% sát th??ng, kéo dài 2 l??t
注意
函数_vsnprintf
,它运行良好

我的功能有什么问题

strlen()
返回了错误的值,
内容明显长于18个字符(68-50)。看起来您传入了一个多字节字符串,您可能需要

int nLenstr = mblen(content, MB_CUR_MAX);
这将获得正确的字符串长度


就坠机事件而言。我想猜测<代码> yvSNPrimff()/Cux>不能处理多个字节序列中间的缓冲区结束。< /P>调试器中发生了什么?嗯,请看一下<代码> pSTRNUM 。当<代码>日志/代码> GIN <代码> PSTRNUM 时,您正在卸载未初始化的数据。你以为会发生什么?由于您试图以某种方式将MBCS字符串转换为Unicode字符串,
content
LOG
可能是正确的。只是编码不对。提示:为什么不使用
LOG
实现作为灵感?除非这也是你自己写的,否则很可能它并不像你的代码那么错误。。。它的长度是68,但它有一些非ascii字符。哇。。。这是一个被破坏的函数。它在
\u vsnprintf
内部崩溃了吗?