0

我正在使用科学框架 ROOT,所以我将提供一些关于我正在做什么的细节,但是如果有人对可能导致这种情况的原因有任何一般性的想法,也许我可以进入源代码并找出什么是正在发生,因为我知道没有很多人使用过 ROOT。

我正在使用 T.Process() 处理 TTree(ROOT 数据结构)。基本上,T.Process 使用一个名为 objdef 的类来分析 TTree 中的数据。它循环遍历 TTree 中的数据并填充将作为新 TTree 输出的向量(如果被问到,我可以更详细地介绍,但我认为陈述我的一般问题比尝试在这个问题中解释整个 ROOT 框架更好) .

指向输出向量的指针在 objdef 类定义中声明。对于我运行的大多数示例,整个系统运行良好。但是对于某些示例,指针有时似乎被截断 (?),从而导致 seg 错误。这是一个例子:

objdef 声明中声明的一些指针是:

std::vector<double>   *ele_pt;
std::vector<float>   *ele_charge;
std::vector<double>   *ele_eta;

当我运行 T.Process() 时,指针显示为,例如:

ele_pt: 0x2ec45a0                                                                                                                                                                                                 
ele_charge: 0x2ec5840                                                                                                                                                                                             
ele_eta: 0x2d89 

第三个指针到底是怎么回事!在每次运行代码期间,哪个指针被截断似乎是随机的。

我希望我能更具体一些,也许来自 SO 的一些尖锐问题可以帮助我确定发生了什么。或者,如果有人知道可能导致这样的指针截断的一般事情,我很想听听。

更新

当我对坏指针执行 sizeof 时,它返回 8。

更新 2

显然,在实际分配任何内存之前,一些指针被初始化为随机值(或者从未初始化为零?),然后没有为它们分配内存。我怀疑 ROOT 框架(特别是 Cint)中有一些错误,但我找到了一种解决方法 - 将所有指针显式设置为 0,从而强制 ROOT 为它们分配内存并给它们一个内存地址。它现在正在工作。似乎这些指针实际上并没有被截断——相反,它们只是一个很小的值。他们从来没有真正的内存地址,所以他们一开始就不会被截断。

4

0 回答 0