ROOT类初始化后成员指针变成野指针的问题

ROOT类初始化后成员指针变成野指针的问题

现在对面向对象和面向过程理解的不够透彻,只是希望用面向对象的形式写出一个类,把一套计算工作写成一个类似与工具包的样子。写出一个简易的雏形,大概构造是这样的:

class A: public TObject
{
private:
	TH1D* a;
	TH2D* b;
	TH3D* data;
public:
	A();
	~A();

	void APlus();
	... ...
};

成员对象a和b对应要求的两套直方图,在构造函数A()中,从.root文件中读取数据写入data指向的内存,然后通过data来计算ab的BinContent。
在构造函数中应用了这样的语句:

A::A()
{
	TFile fdata("xxx.root");
	fdata.GetObject("xxx",data);
	
	... ...
}

将.root文件读取到fdata中,再将其中的对象写入data对应的内存。这样的一个类在实例化时就会出现问题:

root[0]: A* a = new A();
root[1]: a.APlus();
*** Break *** segmentation violation
... ...
... ...

这看起来是调用APlus()时,引用了野指针。但是在构造函数中,已经完成了对所有成员指针的初始化,甚至可以直接用Draw()方法将a,b两个对象的直方图画出来,也就是说,是初始化之后,成员指针变成了野指针。我将a,b改为public,然后直接调用,发现它们确实不再带有当时计算的结果了。

一番检查后,发现将构造函数改成如下形式:

A::A()
{
	TFile* fdata = new TFile("xxx.root");
	fdata->GetObject("xxx",data);
	delete fdata;
	
	... ...
}

这样就不会出现问题。我还不能确定问题具体是为什么,只能估计是TFile对象的内存在ROOT命令行环境中会自动回收,导致内存出现了错误。这有可能和ROOT的命令行环境有关,也有可能和TFile有关。今天先记录下来,之后再多体会补充吧。

发布了29 篇原创文章 · 获赞 3 · 访问量 6702

猜你喜欢

转载自blog.csdn.net/weixin_43316938/article/details/89206858
今日推荐