2015-01-15 62 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()