C ++ shared_ptr绑定映射变换segfault

时间:2015-04-01 10:22:39

标签: c++ c++11 segmentation-fault bind shared-ptr

运行此代码时出现段错误:

#include <memory>
#include <algorithm>
#include <map>
#include <vector>
#include <functional>

using namespace std;
using namespace std::placeholders;    

int main(){
  map<int, shared_ptr<int>> container;
  container[5] = make_shared<int>(7);

  for (int i = 0; i < 10; ++i) {
    vector<shared_ptr<int>> vec(container.size());

    transform(container.begin(), container.end(), vec.begin(),
              bind(&pair<int, shared_ptr<int>>::second, _1));
  }
}

我正在使用c ++ 11模式中的g ++ 4.8.2进行编译。

当我打印shared_ptr的使用计数时,似乎每次for循环运行时它会减1。

2 个答案:

答案 0 :(得分:4)

您可能正在bind(&pair<int, shared_ptr<int>>::second, _1))获得转化,因为pair<int const, shared_ptr<int>>地图中存储的内容(请注意密钥类型上的const)。

虽然我很惊讶它编译没有错误。

尝试以下任何一项:

bind(&pair<int const, shared_ptr<int>>::second, _1))
bind(&map<int, shared_ptr<int>>::value_type::second, _1))
bind(&decltype(container)::value_type::second, _1))

答案 1 :(得分:-1)

你的问题似乎是second不是一个函数(它是一个成员变量),所以它不能与bind绑定。

您可以尝试

transform(container.begin(), container.end(), vec.begin(), [](pair<int, shared_ptr<int>> x) { return x.second; });

transform(container.begin(), container.end(), vec.begin(), bind(&_2nd, _1));

您之前已定义的

shared_ptr<int> _2nd(const pair<int, shared_ptr<int>>& x) { return x.second; }

那会有用。 Live example at Coliru...