Jsoncpp — очень простой тест вылетает, когда Json :: reader выходит за рамки

Я скачал и установил библиотеку jsoncpp. Затем я пытаюсь использовать библиотеку в своем собственном приложении:

#include <json/json.h>

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

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

Программа прекрасно компилируется и связывается, но при запуске SIGSEGV вылетает. Backtrace 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 ++ — может ли это быть проблемой?

4

Решение

Как я прокомментировал:

При компиляции с 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, попробуйте скомпилировать его из исходного архива; построить его вне исходного дерева, например, ../gcc-4.8.1/configure --program-suffix=-4.8 --prefix=$HOME/pub затем make затем make install — после установки его зависимостей

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]