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

时间:2013-07-28 18:30:47

标签: c++ jsoncpp

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

#include <json/json.h>

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

int main(int argc, char ** argv) {
   parseJson();
   exit(0);
}

程序编译和链接很好,但在运行时它与SIGSEGV崩溃。 gdb回溯看起来像这样:

(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

即。对我而言,它似乎在析构函数中崩溃了。据我所知,Json :: Reader没有自己的dstructor,所以这必须是默认的析构函数。正如你所看到的,我正在运行一个相当古老的g ++版本 - 这可能是问题吗?

1 个答案:

答案 0 :(得分:1)

正如我评论的那样:

  

当使用GCC版本4.8.1在Debian / Sid上编译(所以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真的很旧(febr. 2007!)并且不再受支持,并且C ++标准不一致(GCC,现在版本4.8.1,在C ++标准一致性方面取得了巨大进步)自4.1)。

所以我不确定GCC 4.1。是错误的,但我不会感到惊讶:它具有糟糕的C ++声誉,并且C ++标准和GCC编译器都得到了很大的改进。升级您的GCC是值得的,无论是为了更好地支持C ++还是为了改进诊断和优化。

所以我建议你使用更新的GCC;如果您没有root访问权限,请考虑从源代码tarball编译它;用例如在源树之外构建它../gcc-4.8.1/configure --program-suffix=-4.8 --prefix=$HOME/pub然后make然后make install - 安装其依赖项后