Mongodb 插入到对象内部的集合时,C++ 崩溃

Mongodb c++ crashing when inserting into collection inside an object

我正在使用 mongocxx 驱动程序,我正在尝试对集合进行基本插入。

如果我简单地遵循 here 提供的指导方针,它就可以正常工作。

但是,如果我将数据库和集合实例放入一个对象中,插入会在运行时崩溃。因此,对于一个简单的示例,我有一个包含数据库和集合实例的结构,并且在 main():

中创建 Thing 的实例后尝试通过这些实例进行插入
#include <bsoncxx/builder/stream/document.hpp>
#include <bsoncxx/types.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/instance.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/stdx.hpp>
#include <mongocxx/uri.hpp>


struct Thing {
   mongocxx::client client;
   mongocxx::database db;
   mongocxx::collection coll;

   void open_connection(const char* host, const char* db_name, const char* coll_name) {
      mongocxx::instance inst{};
      mongocxx::uri uri(host);

      client = mongocxx::client::client(uri);
      db = client[db_name];
      coll = db[coll_name];
   }
};


int main()
{
   Thing thing;
   thing.open_connection("mongodb://localhost:27017", "test", "insert_test");

   auto builder = bsoncxx::builder::stream::document{};
   bsoncxx::document::value doc_value = builder << "i" << 1 << bsoncxx::builder::stream::finalize;

   auto res = thing.coll.insert_one(doc_value.view()); //crashes

   return 0;
}

我意识到这可以通过在 main 中启动数据库和集合并在 Thing 中仅存储指向集合的指针来解决。 然而,我想知道崩溃的原因,以及是否有可能将数据库和集合实例放在一个对象中。

我认为问题可能是 mongocxx::instance inst{};open_connection 中在堆栈上创建,因此在 open_connection 结束时 inst 被销毁,一些数据可能会变成未定义。

来自documentation

Life cycle: A unique instance of the driver MUST be kept around.

inst移动到主函数。