Boost logo

Boost :

Subject: Re: [boost] [property_tree] Issue: erase is corrupting the tree
From: Seth (bugs_at_[hidden])
Date: 2017-06-09 02:39:34


On 06-06-17 10:32, Lukas via Boost wrote:
> boost::property_tree::ptree loadedJSON;
> boost::property_tree::read_json("animalList.json", loadedJSON);
> auto assoc_it = loadedJSON.find("animals");
> auto it = loadedJSON.to_iterator(assoc_it);
> it = it->second.begin();
> it++; // move to second item
> loadedJSON.erase(it);
> boost::property_tree::write_json("shorterList.json", loadedJSON);
You're using erase on the wrong container.

     auto it = loadedJSON.to_iterator(assoc_it);

Here, it points into the root ptree.

     it = it->second.begin();

Now, it points into the nested ptree ("animals")

    loadedJSON.erase(it);

That's undefined behaviour. Fix:

    #include <boost/property_tree/ptree.hpp>
    #include <boost/property_tree/json_parser.hpp>
    #include <iostream>

    using boost::property_tree::ptree;

    int main() {
        ptree loadedJSON;
        read_json("animalList.json", loadedJSON);

        //auto& animals = *loadedJSON.find("animals");
        auto& animals = loadedJSON.get_child("animals");

        auto it = animals.begin();
        it++; // move to second item
        animals.erase(it);

        write_json("shorterList.json", loadedJSON);
    }


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk