Я попытался использовать ODB в своем проекте. Поэтому я использовал VS2015 для компиляции источников Windows для их библиотеки odb и odb-pgsql, выбрав конфигурацию Release и x64. Я связал библиотеки со своей стандартной установкой postgres (готовые двоичные файлы 64 бит).ODB С PostgresSQL bad_alloc Exception
Мой проект управляется cmake и 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;
}
Уже в compiliation я запутанные предупреждения.
Во время выполнения библиотеки 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 и Multi-Byte, но ничего не помогло. По крайней мере, используя amd64
, я не получил первые 5 предупреждений, упомянутых выше.
Любой человек может мне помочь? :(