在填充直方图的循环中出现错误 Filled mass arrayAborted (core dumped)
Getting error Filled mass arrayAborted (core dumped) in loop that fills histogram
我正在尝试 运行 一个填充直方图数组的 for 循环。每当我 运行 这段代码时,我都会收到同样的错误,说明:
"Error in `./Analysis.exe': free():" *Some memory locations*
"Filled mass arrayAborted (core dumped)"
我是 c++ 的新手,所以可能有一些我在这里没有考虑的内存问题。
我已经尝试通过更改 "Max" 变量来分析循环失败的位置,以便循环仅继续到预定义的点。事实证明,循环总是在循环的最后一次迭代时失败。看起来循环正在遍历预定义的内存,这就是为什么我在循环开始之前为变量 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 * segmentation violation”
问题已解决。我不确定为什么 "TH1D *Mass = new TH1D(....)" 必须在打开 TFile 之前进行初始化。我猜测这里的解决方案是我无权写入 TFile 并且在 TFile 之后定义 TH1D 使得 TH1D 被写入 TFile。
我正在尝试 运行 一个填充直方图数组的 for 循环。每当我 运行 这段代码时,我都会收到同样的错误,说明:
"Error in `./Analysis.exe': free():" *Some memory locations*
"Filled mass arrayAborted (core dumped)"
我是 c++ 的新手,所以可能有一些我在这里没有考虑的内存问题。
我已经尝试通过更改 "Max" 变量来分析循环失败的位置,以便循环仅继续到预定义的点。事实证明,循环总是在循环的最后一次迭代时失败。看起来循环正在遍历预定义的内存,这就是为什么我在循环开始之前为变量 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 * segmentation violation”
问题已解决。我不确定为什么 "TH1D *Mass = new TH1D(....)" 必须在打开 TFile 之前进行初始化。我猜测这里的解决方案是我无权写入 TFile 并且在 TFile 之后定义 TH1D 使得 TH1D 被写入 TFile。