簡體   English   中英

使用STL雙端隊列進行segfault

[英]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循環。

從問題迭代器失效規則

插入

序列容器

  • 向量:插入點之前的所有迭代器和引用均不受影響,除非新的容器大小大於先前的容量(在這種情況下,所有迭代器和引用均無效)[23.2.4.3/1]
  • 雙端隊列:所有迭代器和引用均無效,除非插入的成員位於雙端隊列的末尾(在這種情況下,所有迭代器均無效,但對元素的引用不受影響)[23.2.1.3/1]
  • 列表:所有迭代器和引用均不受影響[23.2.2.3/1]

暫無
暫無

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

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