***堆栈粉碎在使用FEAST返回函数时检测到***错误
*** stack smashing detected *** error at the return of a function using FEAST
我有一个很长的程序,其中有一个使用FEAST计算大矩阵特征值的函数。就在该函数的返回处,我得到了一个*检测到堆栈粉碎*错误,并且我丢失了所有结果。这是我的功能
void Model::eigensolver(double* val, int* ia, int* ja, const int n, int m0, std::string outfilename)
{
// compute Eigenvalues and Eigenvectors by calling FEAST library from MKL
const char uplo='U';
MKL_INT fpm[128], loop;
feastinit(fpm);
//fpm[0]=1;
const double emin=-1,emax=100;
MKL_INT eig_found=0;
double res,epsout;
double *eigenvalues= new double [m0];
double *eig_vec = new double [m0*_dof];
int info;
std::cout << "Everything ready, making call to FEAST." << std::endl;
dfeast_scsrev(&uplo, &n, val, ia, ja, fpm, &epsout, &loop, &emin, &emax, &m0, eigenvalues, eig_vec, &eig_found, &res, &info );
if (info != 0) {
std::cout << "Something is wrong in eigensolver. Info=" << info << std::endl;
exit(0);
}
std::cout << loop << " iterations taken to converge." << std::endl;
std::cout << eig_found << " eigenvalues found in the interval." << std::endl;
std::ofstream evals;
evals.open("evals.dat");
std::cout<<"The eigenfrequencies are:"<<std::endl;
for (int i = 0; i < eig_found; i++)
evals << eigenvalues[i] << std::endl;
evals.close();
delete[] eigenvalues;
delete[] eig_vec;
std::cout << "Writen eigenvalues to file evals.dat." << std::endl;
return;
}
dfeast_csrev是FEAST库中的一个函数(也是英特尔MKL的一部分)。错误发生在返回时(即,在"将特征值写入文件evals.dat."打印之后)。根据我运行的问题,有时我也会在同一点上出现分段错误。
如果我删除了FEAST函数调用,则没有错误。所以,我很困惑我做错了什么。我正在尝试valgrind,但由于代码的大小,它需要很长时间才能运行。
查看https://software.intel.com/en-us/node/521749,我看到res
应该指向"长度为m0的数组"。您的res
只是单个double
。当然,dfeast_csrev不知道这一点,并且在边界之外愉快地写作,从而破坏了您的堆栈。
因此,解决方案是:
double *res = new double [m0];
而不是double res;
相关文章:
- 检测使用 CRTP 的类中的成员函数
- 用于检测函数类型是否为否的特征
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 检测是否存在具有给定签名的函数
- 如何检测 Clang AST C++中的静态函数
- 主函数体未检测到对重载可变变量模板化函数C++的调用
- 如何在C++17中使用type_traits检测具有特定名称和签名的函数(NOT类成员)的存在
- 使用SFINAE来检测void返回类型函数的存在
- 如何检测构造函数是否与抛出的析构函数无关
- 如何检测函数是否执行IO操作
- 用于检测函数是否存在的C++元函数的问题
- 阴算法(音高检测) - 差分函数的替代
- 检测传递给函数模板函数参数的特定函数
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- C++编译器如何检测非常量函数体
- 开放简历.检测多尺度() 函数返回错误
- Clang 无法在赋值运算符/复制构造函数中检测到未初始化的类成员
- 用于成员函数检测的递归type_traits
- 使用 GCC 的函数检测,为什么使用 C++ STL 容器或流 I/O 会导致段错误?
- 整数幂元函数:检测整数溢出