mongo::client::initialize() cause crash

在使用monod的C++ driver时,使用mongo::client::initialize() 方法会导致应用程序crash。

首先要明确一下:

  1. mongo::client::initialize()方法是legacy driver的方法,不推荐和3.X的driver一起使用。
  2. C++ driver是依赖于boost的

mongo::client::initialize()方法中会使用到Option类,但是这个类在头文件中没有定义析构函数,所以就会依赖于编译器来自动推导会这是自动生成的析构函数。crash的原因是,C++的编译器在不同的情况下的推导类型不一样。

case 1

不同的g++版本推导出来的析构函数不一样。所以,如果你的应用程序是用C++11编译的,但是你的driver不是用C++11编译的,肯定会crash。
- For non-C++ 11 builds you typedef stdx::function to be
boost::function.
- For C++ 11 builds you typedef it to be std::function.
https://jira.mongodb.org/browse/CXX-558

case 2.

应用程序的debug版本和release版本生成的析构函数也不一样。这里没有具体的去验证,只是猜想:debug的时候是-g,不会进行优化,这样会编译器会生成Option的析构函数,所以程序不会crash;
但是release版本时,编译器会将要隐式的析构函数drop掉,在link的时候,又发现需要这个函数,于是又生成了一个错误的,然后程序一运行就crash。