2015-01-15 56 views
0
#include <string> 
#include <stdarg.h> 
#include <stdio.h> 
#include <memory> 

void kekeTrace(const char* format, ...) 
{ 
    char buff[1000] = { 0 }; 
    va_list argList; 
    va_start(argList, format); 
    vsnprintf(buff, 1000, format, argList); 
    va_end(argList); 
} 

int main() 
{ 
    std::shared_ptr<int> obj(new int(3)); 
    kekeTrace("%x,%d,%s\n", obj, 1, "w"); //crash 
    kekeTrace("%x,%s\n", obj, "w"); // do not crash 
    return 0; 
} 

第一次调用kekeTrace会崩溃,但第二次调用不会。为什么?为什么在visual studio 2013/2015下发生vsnprintf崩溃?

+1

未定义的行为?必须取消它,'* obj'。 – Dialecticus

回答

2

这两行都是未定义的,所以两者可能会或可能不会崩溃,并且可能会或可能不会输出内容。

目前,编译器通常足够聪明,可以警告关于printf等的格式字符串中不受支持的类型,但由于您正在调用自己的函数,因此编译器不知道要如何处理它。

您需要传递基础指针:使用obj.get()