运行此代码时出现段错误:
#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。
答案 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; }