Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Jsoncpp-当Json::reader超出范围时,非常简单的测试崩溃_C++_Jsoncpp - Fatal编程技术网

C++ Jsoncpp-当Json::reader超出范围时,非常简单的测试崩溃

C++ Jsoncpp-当Json::reader超出范围时,非常简单的测试崩溃,c++,jsoncpp,C++,Jsoncpp,我已经下载并安装了jsoncpp库。然后,我尝试在自己的应用程序中使用该库: #include <json/json.h> void parseJson() { Json::Reader reader; } int main(int argc, char ** argv) { parseJson(); exit(0); } 也就是说,在我看来,它似乎在析构函数中崩溃了。据我所知,Json::Reader没有自己的dstructor,因此它必须是默认的析构函数

我已经下载并安装了jsoncpp库。然后,我尝试在自己的应用程序中使用该库:

#include <json/json.h>

void parseJson() {
   Json::Reader reader;
} 

int main(int argc, char ** argv) {
   parseJson();
   exit(0);
}
也就是说,在我看来,它似乎在析构函数中崩溃了。据我所知,Json::Reader没有自己的dstructor,因此它必须是默认的析构函数。正如您所看到的,我运行的是一个相当旧的g++版本—这可能是问题所在吗?

正如我所评论的:


当在Debian/Sid上使用GCC版本4.8.1(因此libjsoncpp dev
0.6.0~rc2-3
)编译为
g++-4.8-g-Wall-I/usr/include/jsoncpp/esjson.cc-ljsoncpp-o esjson
时,程序在编译时不会出现警告,并且在运行时不会崩溃

和GCC 4.1.2是真正的旧的(!),而且不再支持,并且不是很好的C++标准符合(GCC,现在在4.4.1版本,自从4.1以来在C++标准一致性方面取得了巨大的进步)。 所以我不确定GCC4.1。是有问题的,但我不会感到惊讶:它有坏的C++信誉,并且C++标准和GCC编译器都有了很大的改进。升级GCC是值得的,既支持更好的C++,又改进了诊断和优化。


因此,我建议您使用更新的GCC;如果没有root访问权限,请考虑从源代码中编译它;在Debian/Sid上使用gcc版本4.8.1编译依赖项后,在源代码树之外使用例如
。/gcc-4.8.1/configure--program suffix=-4.8--prefix=$HOME/pub
然后
make
然后
make install
——在安装了依赖项之后构建它(因此libjsoncpp dev
0.6.0~rc2-3
)正如
g++-4.8-g-Wall-I/usr/include/jsoncpp/esjson.cc-ljsoncpp-o esjson
一样,您的程序在编译时没有警告,并且在运行时不会崩溃。我在VS2013中遇到了这个问题。这是因为在进行调试构建时没有链接到库的调试版本。我在一个意大利面代码项目中看到了这个问题。我在webrtc中有静态链接(在jsoncpp中有链接),还通过另一个库动态包含jsoncpp;我想我会责怪老gcc编译器。我不太愿意安装更新的编译器的原因是,我所处的公司环境非常保守,我编写的应用程序必须在分布于整个组织的运行时(即gcc-4.1.2)上运行。我的json需求非常简单,所以我可能会尝试寻找另一个(纯C?)库。在贵公司内部,还有其他很好的理由提倡使用更新的GCC编译器:更好的标准一致性、更好的优化、更好的诊断。。。。对于任何类型的C++编程,使用GCC 4.1是一个很大的麻烦。(大多数编译器bug比这个更难找到)。
(gdb) bt
#0  0x0000003a560b7672 in __gnu_cxx::__exchange_and_add () from /usr/lib64/libstdc++.so.6
#1  0x00000000004031e9 in std::string::_Rep::_M_dispose (this=0xffffffffffffffe9, __a=@0x7fffbfe60e57)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:232
#2  0x0000000000403236 in ~basic_string (this=0x7fffbfe60fb0)
at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:478
#3  0x00000000004038d4 in ~Reader (this=0x7fffbfe60eb0) at /private/joaho/Parser/opm-parser/external/json/json-cpp/include/json/reader.h:23
#4  0x0000000000402990 in parseJson () at /private/joaho/Parser/opm-parser/opm/parser/eclipse/ExternalTests/ExternalTests.cpp:51
#5  0x00000000004029ab in main (argc=1, argv=0x7fffbfe610c8)
at /home/user/Parser/opm-parser/opm/parser/eclipse/ExternalTests/ExternalTests.cpp:56