jsoncpp icon indicating copy to clipboard operation
jsoncpp copied to clipboard

Memory leak: Json::Value cannot be release

Open OnlySoaring opened this issue 1 year ago • 4 comments

Describe the bug When I use Json:: Reader or Json:: parseFromStream to create Json:: Value, the memory of Json:: Value is not released when the function ends

To Reproduce

int main(int argc, char** argv)
{
  while(true)
  {
    Json::Value root;
    std::ifstream ifs("/opt/user.json");
    Json::Reader reader;
    reader.parse(ifs, root);
    ifs.close();

    std::cout<<"1"<<std::endl;
    break;
  }

  while(true)
  {
    std::cout<<2<<std::endl;
  }
return 0;
}

Expected behavior My JSON file has 681MB. When the test program printed 1, the program occupied 2.12GB of memory. At the end of "while", Json:: value should be released, but when the test program prints 2, the memory does not decrease. Whether I use Json:: Reader or Json:: parseFromStream, it's the same. This is fatal for multi program projects as it occupies useless memory.

Desktop (please complete the following information):

  • OS: Ubuntu20.04
  • C++ 17

OnlySoaring avatar Jul 08 '24 03:07 OnlySoaring

Use Json:: Value root or Json:: Value * root=new Json:: Value (); Also unable to release

OnlySoaring avatar Jul 08 '24 03:07 OnlySoaring

I tried this code. However, the code shows a memory leak when you are not handling the signal. If you handle the SIGINT signal try to break the loop using CTRL + C. There is no memory leak. Here is my code. please try this.

#include "jsoncpp/json/json.h" #include <iostream> #include <fstream> #include <signal.h>

bool is_true = true; void sigint(int signum) { is_true = false; }

int main(int argc, char** argv) { signal(SIGINT,sigint);

while(true) { Json::Value root; std::ifstream ifs("/opt/user.json"); Json::Reader reader; reader.parse(ifs, root); ifs.close();

`std::cout<<"1"<<std::endl;`
`break;`

}

while(is_true) { std::cout<<2<<std::endl; } return 0; }

KRashEk avatar Sep 05 '24 12:09 KRashEk

@OnlySoaring ,

you may try to check to replace Json::Value root; with LocalJsonValue root; where LocalJsonValue is defined like this:

class LocalJsonValue : public Json::Value {
public:
  LocalJsonValue() = default;
  ~LocalJsonValue() {
    std::cout<<"Destruct LocalJsonValue\n";
  }
};

Destruct LocalJsonValue should be printed before 2 is being printed.

Is compilation optimization enabled?

daudrain avatar Dec 01 '24 20:12 daudrain

@OnlySoaring I also encountered this problem。

yunhai2009 avatar Dec 23 '24 11:12 yunhai2009