此代码有效:
class Test
{
public:
Test(string name) : _name(name) {};
bool operator()() { cout << "hello " << _name << endl; return true; }
string name() { return _name; }
private:
string _name;
};
pair<string, bool>
inline execute_test(Test* t) {
return pair<string, bool>(t->name(), (*t)());
}
int main()
{
vector<Test*> tests;
vector<pair<string, bool> > results;
tests.push_back(new Test("Test1"));
tests.push_back(new Test("Test2"));
for (unsigned int i=0; i < tests.size(); ++i)
results.push_back(execute_test(tests[i]));
}
现在我想使用transform而不是for circle:
transform(tests.begin(), tests.end(),
results.begin(),
execute_test);
但是我遇到了分段错误。问题在哪里?
答案 0 :(得分:9)
这是因为transform
期望results
对象分配所需的内存,即期望results.size()
至少与tests.size()
一样大。如果要在results
上执行push_back操作,则应使用std::back_inserter(results)
作为第三个参数。否则,当transform
使用您传递的*
输出迭代器时,它将是无效的内存位置,并将导致分段错误。