簡體   English   中英

***使用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_scsrev是FEAST庫(也是intel MKL的一部分)中的函數。 該錯誤就在返回時發生(即在打印“將特征值寫入文件evals.dat”之后)。 根據我遇到的問題,有時我也會在同一時間遇到分割錯誤。

如果刪除FEAST函數調用,則沒有錯誤。 因此,我很困惑自己在做什么錯。 我正在嘗試使用valgrind,但由於我的代碼太大,因此運行時間很長。

查看https://software.intel.com/zh-cn/node/521749上的文檔,我看到res應該指向“長度為m0的數組” 您的res僅是一個double 當然,dfeast_scsrev不知道這一點,並且快樂地在邊界之外寫入,從而破壞了堆棧。

因此解決方法是:

double *res = new double [m0]; 而不是double res;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM