Получение ошибки Заполненный массив массиваAborted (ядро сброшено) в цикле, заполняющем гистограмму - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь запустить цикл for, который заполняет массив гистограмм. Всякий раз, когда я запускаю этот код, я продолжаю получать ту же ошибку, заявляя:

"Error in `./Analysis.exe': free():" *Some memory locations* 
"Filled mass arrayAborted (core dumped)"

Я новичок в c ++, так что, скорее всего, есть некоторые проблемы с памятью, которые я здесь не рассматриваю.

Я попытался проанализировать, где происходит сбой цикла, изменив переменную «Макс» так, чтобы цикл продолжался только до предопределенной точки. Оказывается, что цикл всегда терпит неудачу на последней итерации цикла. Похоже, что цикл проходит через предопределенную память, поэтому я выделил (я думаю) достаточно памяти для переменной mm до начала цикла.

'''
int main(){

  // Initializing the pointers' types
  TFile *f;
  TDirectoryFile *dir;
  TTree *tr;
  TCanvas *BM_canvas;

  // Initializing the B mass variable
  Double_t        B_M;

  // Opening the file
  f = new TFile("*Name of root file*");

  // Extracting the directory from the file
  dir = (TDirectoryFile*)f->Get("*Name of TDirectory file*");

  // Extracting the tree from the directory
  tr = (TTree*)dir->Get("*Name of tree*");

  // Setting the branch address to a pointer with the same name
  tr->SetBranchAddress("B_M", &B_M);

  // Getting the number of entries and printing
  int nentries=tr->GetEntries();
  cout<<nentries<<endl;

  // Defining a histogram for the mass
  TH1F *Mass = new TH1F("Mass","",10000,0,100000);

  int max = 7915;
  double *mm;
  mm = new double[max];


  for (int i=0; i<max; i++){

      tr->GetEntry(i);

      *mm = B_M;
      if (mm != 0){
    Mass->Fill(*mm);
      }

 }

  cout << "Filled mass array";

  return 0;
}
'''

Я ожидаю, что результатом будет заполненный массив Mass с записями, взятыми из листьев "B_M" в корневом файле.

Я попытался вообще пропустить переменную mm, так как это могло вызвать проблему, однако та же ошибка сохраняется. Даже когда я выхожу из цикла, я получаю сообщение об ошибке "* Break * нарушение сегментации"

1 Ответ

0 голосов
/ 07 июня 2019

Проблема решена. Я не уверен, почему, но «TH1D * Mass = new TH1D (....)» должен был быть инициализирован перед открытием TFile. Я предполагаю, что решение здесь состоит в том, что у меня нет доступа для записи в TFile и что определение TH1D после того, как TFile сделал его таким, что TH1D был записан в TFile.

...