c ++ - Pure virtuelle funktionsopkald med JSonCpp

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg fortsætter med at få det, når jeg lukker min ansøgning.
Jeg ved, at det har noget at gøre med JsonCpp, da det kun sker, når jeg bruger Json-værdier.


Jeg synes, det er noget at gøre med, hvordan jeg skaber jsonværdien, men da der ikke er nogen tutorials, har jeg ingen idé om, hvordan jeg skal gøre det


Min kode er i øjeblikket:


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;
}


Jeg skal tilføje dette sker ikke, når jeg ikke gør:
    root [['blah']]=foo;

Bedste reference


EDIT


Fundet dette er et kendt problem (fx her) [4]



  Vises det skyldes en slags fejl i jsoncpp, som gør det ikke til at fungere som globale variabler. Som jeg gætter på den gamle forestilling om, at globale variabler er dårlige nyheder, er det svært at komme væk fra. S * Jeg indpakket hele min json væk fra at være globals, og det virker fint nu. Mindre globals er helt sikkert et godt træk *, uanset hvad der er tilfældet.



Fejlrapport her (zeromus): http://sourceforge.net/tracker/index.php?func=detailu0026amp;aid=2934500u0026amp;group\_id=144446u0026amp;atid=758826[5]


Status er FAST:



  Jeg har rettet det ved at repræsentere det faktum, at en værdi har en implicit afhængighed af en given forekomst af ValueAllocator ved at give den en ValueAllocatorHandle, der kun refereres til, og tager sig af at slette en heap allokeret tildelingsværdi, når den sidste værdi går uden for anvendelsesområdet.






Generelt vil min mistanke være en konstruktør/destructor, der får adgang til virtuelle medlemmer, der fører til UB (og måske mangler virtuelt destructor overhovedet).


Da du nævner app shutdown, er static Json::Value root en mistanke. Hvis dette er på Linux, drev jeg det under valgrind


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


Dette sikrer, at du har de nødvendige tilladelser. Selvfølgelig hjælper det (meget) at kompilere med fejlfindingsinformation.