微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

libpqxx构造函数异常

如何解决libpqxx构造函数异常

我正在尝试创建一个使用libpqxx的库。这是我的代码

void Repository::initialize() {
  try {
    string connectionString = m_connectionData.getConnectionString();
    // connectionString = "host=localhost port=12324 dbname=databasename user=username password=pass"
    auto x = new pqxx::connection(connectionString);
  }
  catch (failure& e) {
    // Exception::Initialization is my exception class.
    throw Initialization("Cannot initialize repository. Error is: " + string(e.what()));
  }
  catch (...) {
    throw Initialization("Cannot initialize repository: unkNown error.");
  }
}

它在Visual Studio 2019中构建。当我运行该程序时,它崩溃了。我无法捕捉到任何异常。

这是调用栈。它似乎在connection_base()的析构函数上崩溃。

>   accountpostgresqlrepository.dll!std::_Tree_val<std::_Tree_simple_types<std::pair<std::string const,pqxx::prepare::internal::prepared_def>>>::_Erase_head<std::allocator<std::_Tree_node<std::pair<std::string const,pqxx::prepare::internal::prepared_def>,void *>>>(std::allocator<std::_Tree_node<std::pair<std::string const,void *>> & _Al) Line 752  C++
    accountpostgresqlrepository.dll!std::_Tree<std::_Tmap_traits<std::string,pqxx::prepare::internal::prepared_def,std::less<std::string>,std::allocator<std::pair<std::string const,pqxx::prepare::internal::prepared_def>>,0>>::~_Tree<std::_Tmap_traits<std::string,0>>() Line 1193    C++
    accountpostgresqlrepository.dll!std::map<std::string,pqxx::prepare::internal::prepared_def>>>::~map<std::string,pqxx::prepare::internal::prepared_def>>>()    C++
    accountpostgresqlrepository.dll!pqxx::connection_base::~connection_base()   C++
    accountpostgresqlrepository.dll!`pqxx::basic_connection_base<pqxx::connect_direct>::basic_connection_base<pqxx::connect_direct>'::`1'::dtor$0() C++
    vcruntime140_1d.dll!00007ff89f5f1030()  UnkNown
    vcruntime140_1d.dll!00007ff89f5f41f7()  UnkNown
    vcruntime140_1d.dll!00007ff89f5f65bb()  UnkNown
    vcruntime140_1d.dll!00007ff89f5f2cf2()  UnkNown
    vcruntime140_1d.dll!00007ff89f5f6d0b()  UnkNown
    ntdll.dll!00007ff8e18d119f()    UnkNown
    ntdll.dll!00007ff8e1851c56()    UnkNown
    vcruntime140_1d.dll!00007ff89f5f698f()  UnkNown
    vcruntime140_1d.dll!00007ff89f5f1c1e()  UnkNown
    vcruntime140_1d.dll!00007ff89f5f2195()  UnkNown
    vcruntime140_1d.dll!00007ff89f5f2ee5()  UnkNown
    vcruntime140_1d.dll!00007ff89f5f6d0b()  UnkNown
    accountpostgresqlrepository.dll!__GSHandlerCheck_EH4(_EXCEPTION_RECORD * ExceptionRecord,void * EstablisherFrame,_CONTEXT * ContextRecord,_disPATCHER_CONTEXT * dispatcherContext) Line 73   C++
    ntdll.dll!00007ff8e18d111f()    UnkNown
    ntdll.dll!00007ff8e187b474()    UnkNown
    ntdll.dll!00007ff8e18cfc4e()    UnkNown
    KernelBase.dll!00007ff8def93e49()   UnkNown
    vcruntime140.dll!00007ff8cb606220() UnkNown
    libpqxx.dll!__scrt_throw_std_bad_alloc() Line 35    C++
    libpqxx.dll!operator new(unsigned __int64 size) Line 48 C++
    [Inline Frame] libpqxx.dll!std::_Default_allocate_traits::_Allocate(const unsigned __int64) Line 77 C++
    [Inline Frame] libpqxx.dll!std::_Allocate_manually_vector_aligned(const unsigned __int64) Line 120  C++
    [Inline Frame] libpqxx.dll!std::_Allocate(const unsigned __int64) Line 201  C++
    [Inline Frame] libpqxx.dll!std::allocator<char>::allocate(const unsigned __int64 _Count) Line 807   C++
    [Inline Frame] libpqxx.dll!std::string::_Construct_lv_contents(const std::string &) Line 2668   C++
    libpqxx.dll!std::string::basic_string<char,std::char_traits<char>,std::allocator<char>>(const std::string & _Right) Line 2276   C++
    libpqxx.dll!pqxx::connectionpolicy::connectionpolicy(const std::string & opts) Line 26  C++
    accountpostgresqlrepository.dll!pqxx::connect_direct::connect_direct(const std::string & opts) Line 92  C++
    accountpostgresqlrepository.dll!pqxx::basic_connection_base<pqxx::connect_direct>::basic_connection_base<pqxx::connect_direct>(const std::string & opt) Line 60 C++
    accountpostgresqlrepository.dll!AccountPostgresqlRepository::Private::Repository::initialize() Line 47  C++
    wTradedesktop.exe!WTradeDesktop::NewAccountWizard::checkConnectionToRepository(const AccountRepository::Metadata & Metadata,const std::vector<std::pair<std::vector<std::string,std::allocator<std::string>>,AccountRepository::Parameter>,std::allocator<std::pair<std::vector<std::string,AccountRepository::Parameter>>> & parameters) Line 69 C++
    wTradedesktop.exe!QtPrivate::FunctorCall<QtPrivate::IndexesList<0,1>,QtPrivate::List<AccountRepository::Metadata const &,std::vector<std::pair<std::vector<std::string,AccountRepository::Parameter>>> const &>,void,void (__cdecl WTradeDesktop::NewAccountWizard::*)(AccountRepository::Metadata const &,AccountRepository::Parameter>>> const &)>::call(void(WTradeDesktop::NewAccountWizard::*)(const AccountRepository::Metadata &,AccountRepository::Parameter>>> &) f,WTradeDesktop::NewAccountWizard * o,void * * arg) Line 152 C++
    wTradedesktop.exe!QtPrivate::FunctionPointer<void (__cdecl WTradeDesktop::NewAccountWizard::*)(AccountRepository::Metadata const &,AccountRepository::Parameter>>> const &)>::call<QtPrivate::List<AccountRepository::Metadata const &,void>(void(WTradeDesktop::NewAccountWizard::*)(const AccountRepository::Metadata &,void * * arg) Line 186    C++
    wTradedesktop.exe!QtPrivate::QSlotObject<void (__cdecl WTradeDesktop::NewAccountWizard::*)(AccountRepository::Metadata const &,AccountRepository::Parameter>>> const &),void>::impl(int which,QtPrivate::QSlotObjectBase * this_,QObject * r,void * * a,bool * ret) Line 419 C++
    [External Code] 
    wTradedesktop.exe!WTradeDesktop::Gui::NewAccountWizard::MainWidget::accountRepositoryCurrentConnectionSelected(const AccountRepository::Metadata & _t1,AccountRepository::Parameter>>> & _t2) Line 368    C++
    wTradedesktop.exe!WTradeDesktop::Gui::NewAccountWizard::MainWidget::enteraccountRepositoryCheckState() Line 77  C++
    wTradedesktop.exe!QtPrivate::FunctorCall<QtPrivate::IndexesList<>,QtPrivate::List<>,void (__cdecl WTradeDesktop::Gui::NewAccountWizard::MainWidget::*)(void)>::call(void(WTradeDesktop::Gui::NewAccountWizard::MainWidget::*)() f,WTradeDesktop::Gui::NewAccountWizard::MainWidget * o,void * * arg) Line 152    C++
    wTradedesktop.exe!QtPrivate::FunctionPointer<void (__cdecl WTradeDesktop::Gui::NewAccountWizard::MainWidget::*)(void)>::call<QtPrivate::List<>,void>(void(WTradeDesktop::Gui::NewAccountWizard::MainWidget::*)() f,void * * arg) Line 186    C++
    wTradedesktop.exe!QtPrivate::QSlotObject<void (__cdecl WTradeDesktop::Gui::NewAccountWizard::MainWidget::*)(void),bool * ret) Line 419    C++
    [External Code] 
    wTradedesktop.exe!WTradeDesktop::NewAccountWizard::run() Line 44    C++
    wTradedesktop.exe!WTradeDesktop::Application::createNewAccount() Line 27    C++
    wTradedesktop.exe!QtPrivate::FunctorCall<QtPrivate::IndexesList<>,void (__cdecl WTradeDesktop::Application::*)(void)>::call(void(WTradeDesktop::Application::*)() f,WTradeDesktop::Application * o,void * * arg) Line 152  C++
    wTradedesktop.exe!QtPrivate::FunctionPointer<void (__cdecl WTradeDesktop::Application::*)(void)>::call<QtPrivate::List<>,void>(void(WTradeDesktop::Application::*)() f,void * * arg) Line 186  C++
    wTradedesktop.exe!QtPrivate::QSlotObject<void (__cdecl WTradeDesktop::Application::*)(void),bool * ret) Line 419  C++
    [External Code] 
    wTradedesktop.exe!WTradeDesktop::Gui::MainWindow::createNewAccountSelected() Line 133   C++
    wTradedesktop.exe!QtPrivate::FunctorCall<QtPrivate::IndexesList<>,void (__cdecl WTradeDesktop::Gui::MainWindow::*)(void)>::call(void(WTradeDesktop::Gui::MainWindow::*)() f,WTradeDesktop::Gui::MainWindow * o,void * * arg) Line 152  C++
    wTradedesktop.exe!QtPrivate::FunctionPointer<void (__cdecl WTradeDesktop::Gui::MainWindow::*)(void)>::call<QtPrivate::List<>,void>(void(WTradeDesktop::Gui::MainWindow::*)() f,void * * arg) Line 186  C++
    wTradedesktop.exe!QtPrivate::QSlotObject<void (__cdecl WTradeDesktop::Gui::MainWindow::*)(void),bool * ret) Line 419  C++
    [External Code] 
    wTradedesktop.exe!WTradeDesktop::Gui::MenuBar::MainMenuBar::createNewAccountSelected() Line 133 C++
    wTradedesktop.exe!QtPrivate::FunctorCall<QtPrivate::IndexesList<>,void (__cdecl WTradeDesktop::Gui::MenuBar::MainMenuBar::*)(void)>::call(void(WTradeDesktop::Gui::MenuBar::MainMenuBar::*)() f,WTradeDesktop::Gui::MenuBar::MainMenuBar * o,void * * arg) Line 152    C++
    wTradedesktop.exe!QtPrivate::FunctionPointer<void (__cdecl WTradeDesktop::Gui::MenuBar::MainMenuBar::*)(void)>::call<QtPrivate::List<>,void>(void(WTradeDesktop::Gui::MenuBar::MainMenuBar::*)() f,void * * arg) Line 186    C++
    wTradedesktop.exe!QtPrivate::QSlotObject<void (__cdecl WTradeDesktop::Gui::MenuBar::MainMenuBar::*)(void),bool * ret) Line 419    C++
    [External Code] 
    wTradedesktop.exe!WTradeDesktop::Gui::MenuBar::Account::newAccountSelected() Line 156   C++
    wTradedesktop.exe!QtPrivate::FunctorCall<QtPrivate::IndexesList<>,void (__cdecl WTradeDesktop::Gui::MenuBar::Account::*)(void)>::call(void(WTradeDesktop::Gui::MenuBar::Account::*)() f,WTradeDesktop::Gui::MenuBar::Account * o,void * * arg) Line 152    C++
    wTradedesktop.exe!QtPrivate::FunctionPointer<void (__cdecl WTradeDesktop::Gui::MenuBar::Account::*)(void)>::call<QtPrivate::List<>,void>(void(WTradeDesktop::Gui::MenuBar::Account::*)() f,void * * arg) Line 186    C++
    wTradedesktop.exe!QtPrivate::QSlotObject<void (__cdecl WTradeDesktop::Gui::MenuBar::Account::*)(void),bool * ret) Line 419    C++
    [External Code] 
    wTradedesktop.exe!main(int argc,char * * argv) Line 8  C++
    [External Code] 

这是Visual Studio中的错误

Visual Studio error

我做错了什么?

我正在使用CMake,这是使用vcpkg创建的libpqxx。该库在运行时使用LoadLibrary加载。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。