C++ C++;Lambda分段断层
以下代码产生分段错误,我不知道原因:C++ C++;Lambda分段断层,c++,reference,lambda,function-pointers,capture,C++,Reference,Lambda,Function Pointers,Capture,以下代码产生分段错误,我不知道原因: myTree<int> tree; tree.insert(10); // not important std::vector<int> v = tree.toVector(); // Segmentation fault NetBeans变量窗口显示v超出了范围 问题:我是否正确使用lambda? 注意:我使用的是g++(GCC)4.7.2(Cygwin)。正如@Arkadiy在评论中提到的,有状态lam
myTree<int> tree;
tree.insert(10); // not important
std::vector<int> v = tree.toVector(); // Segmentation fault
NetBeans变量窗口显示v超出了范围
问题:我是否正确使用lambda?
注意:我使用的是g++(GCC)4.7.2(Cygwin)。正如@Arkadiy在评论中提到的,有状态lambda不会衰减为函数指针。解决方法是将您的
traverseInoder
编写为接受可调用对象的模板
template<class Func>
void traverseInOrder(Func visitFunc)) {
traverseInOrder(visitFunc, root);
}
这是一个关于如何理解您编写的代码以及如何使用调试器的问题吗?啊-这很有趣。根据this(),只有无状态lambda可以作为函数指针传递。您的代码不是无状态的。@不是sehe我从来没有打算提供可编译的精简代码。很抱歉(我会加一张便条)。但你也不是很好(“愚蠢地忽略了”)——显示损坏行为的实际简化版本。当
模板
类
的成员中有lambda,并将其转换为函数指针时,就会出现这种情况。确保它是无状态的代码没有运行,我们得到了完全的废话。@Robert作为旁白,链接的ideone是一个很好的简化示例。它合成、运行和分割故障。我通过消除代码中没有停止segfault的所有内容来生成它。在这里提问时,先做这一步被认为是有礼貌的。非常感谢!很抱歉,没有提供可编译的示例。@robert-您能将编译器及其版本作为问题的一部分记录下来吗?这真的应该是一个编译时错误。@robert很高兴能帮上忙@我使用的是g++(GCC)4.7.2(Cygwin)。我要给这个问题加一条注释。
v.insert(v.end(), n->count, n->key);
template<class Func>
void traverseInOrder(Func visitFunc)) {
traverseInOrder(visitFunc, root);
}
void traverseInOrder(std::function<void(node<T>*)> visitFunc)) {
traverseInOrder(visitFunc, root);
}