ODB с исключением PostgreSQL bad_alloc

Я пытался использовать ODB в моем проекте. Поэтому я использовал VS2015 для компиляции исходников Windows для их библиотек odb и odb-pgsql, выбрав конфигурацию Release и x64. Я связал библиотеки из моей стандартной установки postgres (предварительно скомпилированные двоичные файлы 64 бит).

Мой проект управляется cmake и QtCreator. Вот настройка компилятора из набора, который я использую.

настройка комплекта в QtCreator

Я создал очень простой проект, который повторяет ошибку. Вот CMakeLists.txt

project(minimal_odb CXX)
INCLUDE_DIRECTORIES(
"C:/Users/micha/Downloads/libodb-2.4.0/libodb-2.4.0/""C:/Users/micha/Downloads/libodb-pgsql-2.4.0/libodb-pgsql-2.4.0/")
add_executable(exec main.cpp)
target_link_libraries(exec
"C:/Users/micha/Downloads/libodb-2.4.0/libodb-2.4.0/lib64/odb.lib""C:/Users/micha/Downloads/libodb-pgsql-2.4.0/libodb-pgsql-2.4.0/lib64/odb-pgsql.lib")

Запущенный cmake напечатает используемый компилятор.

-- The CXX compiler identification is MSVC 19.0.23506.0
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done

здесь main.cpp

#include "odb/pgsql/database.hxx"
int main() {
const std::string pg = "postgres";
::odb::pgsql::database db(pg, pg, pg, pg, 0);
return 0;
}

Уже во время компиляции я получаю запутанные предупреждения.

предупреждения компилятора

Во время выполнения библиотеки DLL находятся по измененному пути environemt

C:\Users\micha\Downloads\libodb-2.4.0\libodb-2.4.0\bin64;
C:\Users\micha\Downloads\libodb-pgsql-2.4.0\libodb-pgsql-2.4.0\bin64

Однако моя программа мгновенно завершается с исключением bad_alloc. Я отладил приложение и вот мой стек вызовов.

стек вызовов во время отладки

Ошибка возникает только тогда, когда строка копируется в локальный user_ переменная от ::odb::pgsql::database,

Если я углублюсь в назначение копирования, то увижу, что передаваемая строка из моего основного набора не настроена и указывает на 0x0, считывающее случайные значения из памяти.

значения стека в операции присваивания

Приложение выводит следующее на мой терминал.

Exception at 0x7ffd148d1f08, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) (first chance) at f:\dd\vctools\crt\vcstartup\src\heap\throw_bad_alloc.cpp:33

Exception at 0x7ffd148d1f08, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) (first chance) at f:\dd\vctools\crt\vcstartup\src\heap\throw_bad_alloc.cpp:33

Exception at 0x7ffd148d1f08, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) (first chance) at c:\program files (x86)\microsoft visual studio 14.0\vc\include\xstring:2185

Exception at 0x7ffd148d1f08, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) (first chance) in ntdll!RcConsolidateFrames

Exception at 0x7ffd148d1f08, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in ntdll!RcConsolidateFrames

Я не удивляюсь, получая bad_alloc с этим _Num ценность, но мне интересно, почему моя строка испорчена. Я попробовал другой компилятор, такой как amd64 и скомпилировал odb, odb-pgsql, используя UNICODE и многобайтовый набор символов, но ничего не помогло. По крайней мере, используя amd64 Я не получил первые 5 предупреждений, упомянутых выше.

0

Решение

Помогает ли это изменить const std::string pg = "postgres"; в std::string pg = "postgres";?

В противном случае это выглядит как проблема со связыванием (отредактируйте / удалите ответ, если это не поможет).

0

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

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

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