Чистый виртуальный вызов функции с JSonCpp - PullRequest
1 голос
/ 31 октября 2011

Я продолжаю получать это, когда закрываю свое приложение. Я знаю, что это как-то связано с JsonCpp, так как это происходит только тогда, когда я использую значения Json.

Я думаю, что это как-то связано с тем, как я создаю значение 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;

1 Ответ

2 голосов
/ 31 октября 2011

РЕДАКТИРОВАТЬ

Обнаружено, что это известная проблема (например, здесь )

Оказывается, это связано с какой-тоошибка в jsoncpp, из-за которой он не работает как глобальные переменные.Который я предполагаю, что старое представление о том, что глобальные переменные являются плохими новостями, трудно избежать.S * o Я завернул весь свой JSON от глобальности, и теперь он работает отлично.Меньше глобалов, безусловно, хороший ход *, в любом случае.

Сообщение об ошибке здесь (ноль): http://sourceforge.net/tracker/index.php?func=detail&aid=2934500&group_id=144446&atid=758826

СтатусИСПРАВЛЕНО:

Я исправил это, представив тот факт, что Value имеет неявную зависимость от данного экземпляра ValueAllocator, предоставив ему ValueAllocatorHandle, который просто подсчитывает ссылки и заботится об удалении выделенной кучи.allocator, когда последнее значение выходит из области видимости.


В общем, я подозреваю, что конструктор / деструктор получает доступ к виртуальным элементам, ведущим к UB (и, возможно, вообще отсутствует виртуальный деструктор).

Поскольку вы упоминаете о завершении работы приложения, static Json::Value root является подозрительным.Если это в Linux, я бы запустил его под Valgrind

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

Это гарантирует, что у вас есть необходимые разрешения.Конечно, это помогает (очень) компилировать с отладочной информацией.

...