2011-10-31 19 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

EDIT

(例えばhere

これは、それがグローバル変数として動作しない可能jsoncppのバグのいくつかの並べ替えによるものですが判明します。グローバル変数は悪いニュースであるという古い考えを思いつきました。 S * o私はすべてのjsonをグローバルから外してしまいましたが、現在は正常に動作しています。どんな場合でも、グローバルの数が少なくても良い動きだと確信しています。 *

ここ(zeromus)バグレポート:http://sourceforge.net/tracker/index.php?func=detail&aid=2934500&group_id=144446&atid=758826

状態が固定されている:

は、私は価値が与えられたインスタンス上で暗黙の依存関係を持っているという事実を表現することによってそれを修正しましたValueAllocatorのValueAllocatorHandleを与えることによって、それは単にカウントされた参照であり、最後のValueが範囲外になったときにヒープ割り当てアロケータを削除することに注意してください。一般的に


私の疑惑は、コンストラクタ/デストラクタUBにつながる仮想メンバーにアクセスする(そしておそらくすべての仮想デストラクタを逃す)になります。

あなたはアプリシャットダウンについて言及しているので、static Json::Value rootは疑わしいです。これがLinux上にある場合、私はvalgrindの下で実行します。

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

これは、必要な権限を持っていることを確認します。もちろん、デバッグ情報をコンパイルするのに役立ちます(たくさん)。

+0

Imは現在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

だから、あなたが参照しているルート["blah"] = fooはどこですか? – sehe

+0

ルート別["blah"] = foo私はremakeDefaultのすべてのものを意味しました。 すなわち ルート["WindowWidth"] = WindowWidth; ルート["WindowHeight"] = WindowHeight; ルート["FullScreen"] =全画面; ルート["AntiAliasing"] =アンチエイリアシング; ルート["VSync"] = VSync。 ルート["FrameRateLimit"] = FrameRateLimit; ルート["AspectRatio"] = AspectRatio; ルート["解像度"] =解像度; – Richy19

関連する問題