mongo::client::initialize() cause crash

来源:互联网 发布:外汇行情数据分析 编辑:程序博客网 时间:2024/06/10 04:51
在使用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<T> to be boost::function<T>.
- For C++ 11 builds you typedef it to be std::function<T>.
https://jira.mongodb.org/browse/CXX-558

case 2.

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




原创粉丝点击