【问题标题】:Can I use jsoncpp with dynamic allocation?我可以使用动态分配的 jsoncpp 吗?
【发布时间】:2017-03-16 08:32:45
【问题描述】:

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

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

所以我试图通过动态分配使 Json::value 变量并更仔细地检查内存损坏。

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

我很抱歉我的英语不好。

谢谢!

【问题讨论】:

  • 可能。如果您发布一些示例代码,展示您对非动态分配所做的工作以及您对动态分配所做的工作,您将获得更多 更好的答案。关于内存损坏的问题在于,通过进行更多分配,您可能会将损坏转移到仅在您进行重要演示/老师运行它时才会导致问题的地方。

标签: c++ jsoncpp


【解决方案1】:

当您想自己管理对树中值的引用时,或者当您想引用值的内部时,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;
}

【讨论】:

  • Json::Value json = new Json::Value("a string value"); 应该没有new? (也可能会提到 C++11 智能指针?)
  • @UnholySheep:对;相应地调整了答案。
猜你喜欢
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 2023-02-08
  • 2018-05-12
  • 1970-01-01
  • 2018-05-26
相关资源
最近更新 更多