[英]segfault using STL deque
當循環在81o迭代中到達時,我的代碼出現了奇怪的段錯誤(請參見下文),我不知道為什么會這樣。 我使用了valgrind,但是它溢出了一個無法理解的錯誤,我認為這是來自stl的錯誤,導致讀取了無效的內存地址。 不久前,在49o迭代中,它發出警告,說在64個字節的塊之一中有48個字節的地址被釋放。
結束時說“ 0x8沒有堆棧,malloc或(最近)釋放”,段發生的行是粘貼的第78行,在de內第一次訪問el循環,所以看來我應該到達隊列的末尾,但是由於第74行,情況並非如此。
#include <iostream>
#include <fstream>
#include <cmath>
#include <string>
#include <vector>
#include <deque>
#include <gsl/gsl_math.h>
#include <gsl/gsl_monte.h>
#include <gsl/gsl_monte_plain.h>
#include <gsl/gsl_monte_miser.h>
#include <gsl/gsl_monte_vegas.h>
using namespace std;
const int D=1;
double f(double *x,size_t n,void *params){
if(-1. <= x[0] && x[0] <= 1. )
return 0.75*(1.-(x[0]*x[0]));
else
return 0;
}
double g(double *x,size_t n,void *params){
if(-1. <= x[0] && x[0] <= 1. )
return 1.5*(x[0]*x[0]);
else
return 0;
}
typedef struct domain{
int good;
double xi[D],xf[D];
double S;
} domain;
int main(){
int i,j,k,counter=0;
double cutoff=0.025,S,err;
domain mdel,tdel;
deque <double> lside,rside;
deque <double> :: iterator lel,rel;
deque <domain> dom;
deque <domain> :: iterator el;
//double xi[D], xf[D];
double xi,xf;
size_t calls = 500000;
gsl_monte_function F;
const gsl_rng_type *T;
gsl_rng *r;
//gsl_monte_vegas_state *s = gsl_monte_vegas_alloc (D);
gsl_monte_miser_state *s_m=gsl_monte_miser_alloc (D);
T = gsl_rng_default;
r = gsl_rng_alloc (T);
F.f = &f;
F.dim=D;
F.params=NULL;
mdel.good=0;
mdel.xi[0]=-1.;
mdel.xf[0]=1.;
mdel.S=1.0;
//lside.push_back(-1.0);
//rside.push_back(1.0);
dom.push_back(mdel);
//while()
for(el=dom.begin();el!=dom.end();el++){
//for(i=0;i<D;i+=1){xi[i]=el->xi[i];xf[i]=el->xf[i];}
S=0.0;
if(el==dom.end())
cout<< "end of deque\n";
//xi[0]=el->xi[0];
//xf[0]=el->xf[0];
xi=el->xi[0];
xf=el->xf[0];
//xi=*lel;
//xf=*rel;
gsl_monte_miser_integrate(&F,&xi,&xf,D,calls,r,s_m,&S,&err);
//gsl_monte_vegas_integrate (&F, &xi, &xf, D, 10000, r, s,&S, &err);
//do{
// gsl_monte_vegas_integrate (&F, &xi, &xf, D, calls/5, r, s,&S, &err);
//}while (fabs (gsl_monte_vegas_chisq (s) - 1.0) > 0.5);
el->S=S;
cout << "size & maxsize: " << dom.size() << " "<< dom.max_size() << "\n";
cout<< "counter @ " << counter << " ";
//cout << "[" << xi[0] << "," << xf[0] << "] : ";
cout << "[" << xi << "," << xf << "] : ";
cout << "S= " << S << " +- " << err << " : " << 0.75*(xf-xi-(xf*xf*xf-xi*xi*xi)/3.0) <<"\n\n";
if(S > cutoff){
el->good=1;
tdel.good=0;
tdel.xi[0]=el->xi[0];
tdel.xf[0]=(el->xi[0]+el->xf[0])/2.;
tdel.S=0.0;
dom.push_back(tdel);
//lside.push_back(tdel.xi[0]);
//rside.push_back(tdel.xf[0]);
tdel.good=0;
tdel.xi[0]=(el->xi[0]+el->xf[0])/2.;
tdel.xf[0]=el->xf[0];
tdel.S=0.0;
dom.push_back(tdel);
//lside.push_back(tdel.xi[0]);
//rside.push_back(tdel.xf[0]);
}
counter++;
}
//gsl_monte_vegas_free (s);
gsl_monte_miser_free (s_m);
gsl_rng_free (r);
return 0;
}
如果有人可以幫助我,我將非常感激
ps:代碼不需要任何輸入,因此只需編譯並將其鏈接到GSL
你是無效的el
當您添加元素到deque的迭代器dom
中的中間for
循環。
從問題迭代器失效規則 :
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.