2011-10-31 124 views
1

當我關閉我的應用程序時,我總是收到這個消息。 我知道它與JsonCpp有關,因爲它僅在使用Json值時發生。與JSonCpp的純虛函數調用

我認爲它是與我是如何創建的JSON值但有沒有真正的任何教程,我不知道我應該怎麼辦呢

我的代碼是目前:

static Json::Value root; // will contains the root value after parsing. 

unsigned int WindowSettings::WindowWidth = 800; 
unsigned int WindowSettings::WindowHeight = 600; 
bool WindowSettings::FullScreen = false; 
unsigned short WindowSettings::AntiAliasing = 16; 
bool WindowSettings::VSync = false; 
short WindowSettings::FrameRateLimit = 60; 
AspectRatios WindowSettings::AspectRatio = ar4p3; 
Resolutions WindowSettings::Resolution = r800x600; 
Json::Value WindowSettings::root = Json::Value(); 

void WindowSettings::remakeDefault() 
{ 
    root["WindowWidth"] = WindowWidth; 
    root["WindowHeight"] = WindowHeight; 
    root["FullScreen"] = FullScreen; 
    root["AntiAliasing"] = AntiAliasing; 
    root["VSync"] = VSync; 
    root["FrameRateLimit"] = FrameRateLimit; 
    root["AspectRatio"] = AspectRatio; 
    root["Resolution"] = Resolution; 
    saveToFile("conf.json"); 
} 

bool WindowSettings::saveToFile(const std::string &fileName) 
{ 
    Json::FastWriter writer; 
    // Make a new JSON document for the configuration. Preserve original comments. 
    std::string outputConfig = writer.write(root); 

    std::ofstream myfile; 
    myfile.open (fileName.c_str(), std::ios::out | std::ios::trunc | std::ios::binary); 
    if (myfile.is_open()) 
    { 
     myfile << outputConfig.c_str(); 
     myfile.close(); 
    } 
    return true; 
} 

我應該添加這個不會發生,當我不做: root [「blah」] = foo;

+0

....沒有'root [「blah」] = foo' ?! – sehe

回答

2

編輯

發現這是一個已知的問題(例如here

原來,這是由於在jsoncpp某種錯誤的,這使得它不能作爲全局變量的工作。我猜想,全球變量是壞消息的舊觀念很難擺脫困境。 S * o我把所有的JSON都從全局變量中解放出來,現在它工作的很好。不管是什麼情況,收益少的當然是一個好的舉動 *。

錯誤報告這裏(zeromus):http://sourceforge.net/tracker/index.php?func=detail&aid=2934500&group_id=144446&atid=758826

狀態是固定的:

我已經代表一個值對一個給定的情況下隱式相關的事實固定它ValueAllocator通過給它一個ValueAllocatorHandle,它只是引用計數,並在最後一個值超出範圍時負責刪除堆分配分配器。


一般來說我懷疑會是一個構造函數/析構函數訪問虛擬成員導致UB(或許缺少虛析構函數的話)。

既然你提到應用程序關機,static Json::Value root是一個嫌疑人。如果這是在Linux上,我會運行它下valgrind

sudo -E valgrind --db--attach=yes ./yourprogram 

這確保您有必要的權限。當然,它有助於(很多)用調試信息進行編譯。

+0

我目前在使用VS2010的Windows上,我已經在調試模式下運行它,但它並沒有給我很多信息。 使用中斷功能帶我到這裏 if(rterrnum!= _RT_CRNL && rterrnum!= _RT_BANNER && rterrnum!= _RT_CRT_NOTINIT) { 開關(_CrtDbgReportW(_CRT_ERROR,NULL,0,NULL,ERROR_TEXT)) { 殼體1:_CrtDbgBreak(); msgshown = 1;打破; 情況0:msgshown = 1;打破; } } 具體案例1 – Richy19

+0

那麼,您所指的'root [「blah」] = foo'在哪裏? – sehe

+0

By root [「blah」] = foo我的意思是remakeDefault中的所有東西。 即 root [「WindowWidth」] = WindowWidth; root [「WindowHeight」] = WindowHeight; root [「FullScreen」] = FullScreen; root [「AntiAliasing」] = AntiAliasing; root [「VSync」] = VSync; root [「FrameRateLimit」] = FrameRateLimit; root [「AspectRatio」] = AspectRatio; root [「Resolution」] =分辨率; – Richy19