我可以将 jsoncpp 与动态分配一起使用吗?

Can I use jsoncpp with dynamic allocation?

本文关键字:一起 动态分配 jsoncpp 我可以      更新时间:2023-10-16

我遇到了一些内存损坏的jsoncpp问题。

当我在本地 Json::Value 变量中分配一些值时,有时它会得到错误的数据并导致崩溃。

所以我正在尝试使用动态分配使 Json::value 变量并更仔细地检查内存损坏。

无论如何,我的问题是,我可以将jsoncpp与动态分配一起使用吗?你认为它比以前安全吗?

我很抱歉我缺乏英语。

谢谢!

当您想要自行管理对树中值的引用时,或者当您想要引用值的内部时,JsonCpp 可能会变得不方便。请参阅以下代码,其中介绍了如何节省使用的三种方法,以及显示一些常见陷阱的两个示例。希望它有所帮助。

请注意,在

处理"动态分配"时,智能指针通常非常方便,可以降低由于在正确点分配/删除对象时的错误而导致内存泄漏或内存损坏的风险。例如,授予shared_ptr。

Json::Value createJsonValue() {
    Json::Value json("a string value");
    return json;  // OK - enforces a copy
}
Json::Value *createJsonValueReference() {
    Json::Value *json_dynamic = new Json::Value("a string value");
    return json_dynamic;  // OK - does not enforce a copy but keeps json value in heap
}
std::shared_ptr<Json::Value> createJsonValueSmartPointer() {
    std::shared_ptr<Json::Value> result(new Json::Value("a string value"));
    return result;  // OK - creates a json::value on the heap and wraps it by a shared_ptr object
}
Json::Value &referenceToLocalJson() {
    Json::Value json("a string value");
    return json;  // Not OK: Reference to stack memory associated with local variable `json` returned
}
const char* getJsonValueContent() {
    Json::Value json("a string value");
    return json.asCString();  // critical: reference to internals of object that will be deleted.
}
int main()
{
    Json::Value copied = createJsonValue(); // will be a copy; lifetime is until end of main
    Json::Value *ptr = createJsonValueReference();  // will be a reference to an object on the heap; lifetime until you call `delete ref`
    std::shared_ptr<Json::Value> smartptr = createJsonValueSmartPointer(); // share_ptr object, managing a reference to an object on the heap; lifetime of shared_ptr until end of main; lifetime of referenced object until the last shared_ptr pointing to it is destroyed
    Json::Value &critical = referenceToLocalJson(); // Critical; will refer to an object that has already been deleted at the end of "referenceToLocalJson"
    const char* content = getJsonValueContent();  // critical: reference to internals of object that will be deleted.
    cout << "copied:" << copied << std::endl;
    cout << "reference:" << *ptr << std::endl;
    cout << "smartptr:" << *smartptr << std::endl;
    // cout << "critical:" << critical << std::endl;  // undefined outcome
    // cout << "content:" << content << std::endl;  // undefined outcome
    delete ptr;  // OK - will free object referred to by ptr
    // smartptr will be deleted together with the json value it refers to at the end of this function; no "explicit" delete
    return 0;
}