open-source-parsers / jsoncpp

A C++ library for interacting with JSON.
Other
8.06k stars 2.63k forks source link

Memory leak: Json::Value cannot be release #1548

Open OnlySoaring opened 2 months ago

OnlySoaring commented 2 months ago

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):

OnlySoaring commented 2 months ago

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

KRashEk commented 1 day ago

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