私は科学フレームワーク ROOT を使用しているので、それを使って何をしているのかについて具体的に説明しますが、これを引き起こす原因について一般的なアイデアを持っている人がいる場合は、ソース コードを調べて何が原因かを突き止めることができます。多くの人がROOTを使用していないことを私は知っているので、起こっています。
T.Process() を使用して TTree (ROOT データ構造) を処理しています。基本的に、T.Process は objdef というクラスを使用して、TTree 内のデータを分析します。TTree のデータをループし、新しい TTree として出力されるベクトルを塗りつぶします (尋ねられれば、より具体的に説明できますが、この質問で ROOT フレームワーク全体を説明するよりも、一般的な質問を述べた方がよいと思います)。 .
出力ベクトルへのポインターは、objdef クラス定義で宣言されます。私が実行したほとんどのサンプルでは、システム全体がうまく機能しています。ただし、一部のサンプルでは、ポインターが切り捨てられたように見える場合があり (?)、セグ フォールトが発生します。次に例を示します。
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
3 番目のポインタは一体どうなっているのでしょう。どのポインターが切り捨てられるかは、コードの実行ごとにランダムであるようです。
もっと具体的に言えばいいのにと思います。おそらく、SOからのいくつかの鋭い質問が、何が起こっているのかを判断するのに役立つでしょう。または、このようなポインターの切り捨てを引き起こす可能性のある一般的なことを誰かが知っている場合は、ぜひ聞きたいです。
アップデート
不良ポインタに対して sizeof を実行すると、8 が返されます。
更新 2
明らかに、メモリが実際に割り当てられる前に、いくつかのポインタがランダムな値に初期化された(またはゼロに初期化されなかった?)ため、メモリが割り当てられませんでした。ROOT フレームワーク (具体的には Cint) の奥深くにバグがあると思われますが、回避策を見つけました。すべてのポインターを明示的に 0 に設定し、ROOT にメモリを割り当てさせ、メモリ アドレスを与えるように強制します。それは今働いています。おそらく、ポインターは実際には切り捨てられたのではなく、小さな値だったようです。それらは実際のメモリアドレスを持っていなかったので、そもそも切り捨てられることはありませんでした.