程序与" bad_function_call"崩溃当一个lambda的struct / class成员被调用时

时间:2017-06-13 06:36:04

标签: c++ class c++11 struct lambda

我想测试使用std::dequestd::deque::cleanerstd::deque::swap清除std::deque::pop_back的方法更快。

为此,我创建了一个程序:

  1. 一个测试Testit并使用特定方法接收lambda的函数;
  2. 一个带有方法描述的结构,一个带有方法本身和结果的lambda;
  3. 当我运行程序时,我已经得到了" bad_function_call "。

    该程序出了什么问题?如何修复它以使struct / class按照lambda成员的意愿运行?

    您可以在下面看到该计划的重要部分:

    //Procedure to test. It receive a lambda with the method to clean the deque up.
    int Testit(auto& fCleanUp_the_Container) {
        (...)
        deque<string> vdTEST;              //deque to be tested
        //Add elements to vdTEST
    
        fCleanUp_the_Container(vdTEST);
        (...)
    }
    
    struct dData {
        //The Description and lMethodtoCleanUp will be initialize with the std::vector::emplace_back method.
        dData(string Description, function<void(deque<string>& vdTEST)> lMethodtoCleanUp) {};
        int Results = 0;
        string Description;
        function<void(deque<string>& vdTEST)> lMethodtoCleanUp;
    };
    
    int main () {
        (...)
        //upload the data to a vector;
        vector<dData> dDt;
        dDt.emplace_back("clear", [](deque<string>& vdTEST) {vdTEST.clear();}); //Using std::deque::clear
        dDt.emplace_back("swap", [](deque<string>& vdTEST){deque<string> vdTMP; vdTEST.swap(vdTMP);}); //Using std::deque::swap
        dDt.emplace_back("pop_back", [](deque<string>& vdTEST){while (!vdTEST.empty()) vdTEST.pop_back();}); //Using std::deque::pop_back
    
        //running the test
        for (int iIta=1; iIta != noofCycles; iIta++) {
            cout << "\nCycle " << iIta << "...";
            for (auto& iIt : dDt)                           //Test all members of dDt
                iIt.Results += Testit(iIt.lMethodtoCleanUp);
        }
    
        (...)
     }
    

1 个答案:

答案 0 :(得分:2)

你的构造函数

dData(string Description, function<void(deque<string>& vdTEST)> lMethodtoCleanUp) {};

忽略其参数DescriptionlMethodtoCleanUp。它不会初始化同样恰好名为DescriptionlMethodtoCleanUp的类成员。

你应该做两件事:

  1. 阅读成员初始化列表here是其中许多相关的SO问题)。
  2. 启用所有编译器警告并将其视为错误。
  3. 正确的构造函数实现将是:

    dData(string Description, function<void(deque<string>& vdTEST)> lMethodtoCleanUp) 
       : Description(Description), lMethodtoCleanUp(lMethodtoCleanUp) {};
    

    注意例如Description(Description)两次出现的Description引用了两个不同的变量:类成员和构造函数参数。