使用Armadillo类型的lambda函数崩溃的未知原因
Unknown cause of crash in lambda function using Armadillo types
EDIT:更新代码使两个函数更相似
我在lambda函数中使用armadillo类型时遇到问题,当有东西试图读取无效的内存位置时,会导致崩溃。如果我把同一个表达式移到一个正常函数中,一切都会顺利进行。
因此,简单的工作示例:
#define ARMA_USE_CXX11
#include <armadillo>
using namespace arma;
rowvec2 funcLambda( double value, const rowvec2 &vA, const rowvec2 &vB, const double &const1, const double &const2 ){
return min( vA * const1, vB * const2 );
}
int main( void ){
rowvec2 vA = {.12, .44};
rowvec2 vB = {2, 2};
auto const1 = double( 1.2 );
auto const2 = 3.1;
auto fLambda = [&]( double value ){ return min( vA * const1, vB * const2 );};
rowvec2 z = rowvec2({0.0, 0.0});
// This works fine
z = funcLambda( 100, vA, vB, const1, const2 );
// This crashes
z = fLambda( 100 );
return 1;
}
这个例子在注释所在的地方崩溃,包括和不包括"using namespace arma;"行,包括和没有#define arma_USE_CXX11,并且使用32和64位内存地址。
我不知道我是在lambda函数中做错了什么,还是由armadillo引起的问题。如果我去掉方程的部分(例如标量的乘法),它会很好。
感谢您的帮助。
感谢
Henrik
Armadillo大量使用惰性评估,并具有大量的中间结果,这些结果包含其他寿命有限的中间结果1。在这里咬你的是min
的返回值,你试图在得到它的时候返回它
如果你这样更改lambda:
auto fLambda = [&]( double value ) -> rowvec2 { return min( vA * const1, vB * const2 ); };
也就是说,如果您明确指定它返回rowvec2
,而不是从min
获得的Glue<eOp<rowvector2, eop_scalar_times>, eOp<rowvector2, eop_scalar_times>, glue_min>
,那么问题应该会消失,因为在函数返回之前,中间结果会转换为有形的结果。
1是的,真的。您可以在/usr/include/armadillo_bits/Glue_bones.hpp
中看到这一点。它们根本就不是用来储存的。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 继承期间显示未知行为的子类
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- 输入中的字符串数未知(以字母表示)
- CoInitialize()在单独的线程上崩溃而不返回
- 具有未知值时的时间复杂性
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- Qt5 C++ 应用程序因未知原因崩溃
- 当通过结构中的指针引用COM_PTR的向量时,向量大小未知时崩溃
- 多次使用动态字符数组后出现未知崩溃
- C++程序由于某种未知原因而崩溃
- C++编译崩溃与未知原因-神话电视补丁
- 使用Armadillo类型的lambda函数崩溃的未知原因
- 克鲁斯卡尔算法代码因未知原因而崩溃
- C++、委派、应用程序崩溃、未知原因