Hi,
first of all, you should use pointers to histograms:
class MyClass : public TObject {
private:
TH1D *hist;
public:
// base class's default constructor is called automatically
MyClass() : hist(0) {}
TH1* GetHist();
};
// in the source file:
TH1* MyClass::GetHist() {
if (!hist)
hist = new TH1D("myhist", "my histogram;x;Entries", 100, 0., 1.);
return hist;
}
Then you should try to give these histograms names which depend on the object, i.e. which are different for each object. ROOT allows to lookup histograms by their names - if they all have the same name that doesn't work. So this version is better:
class MyClass : public TNamed {
private:
TH1D *hist;
public:
MyClass() : hist(0) {}
TH1* GetHist();
};
// in the source file:
TH1* MyClass::GetHist() {
if (!hist)
hist = new TH1D(GetName(), GetTitle(), 100, 0., 1.);
return hist;
}
You should put GetHist() into the source because it has a call to "new"; as a generic rule no calls to new and delete should be in a header (due to compiler flag specific, incompatible implementations of new and delete, which might get mixed when mixing compiler flags).
Cheers, Axel.
OKUMURA, Akira wrote:
> Hello ROOTers,
>
> If I make a class which has histogram as a member as below, at the line
> of declaration of 'MyClass b' ROOT warns 'Potential memory leak'.
>
> class MyClass : public TObject {
> private:
> TH1D hist;
> /* other members */
> public:
> MyClass() : TObject() {hist = TH1D(0, 0, 1, 0, 1);}
> /* other functions */
> };
>
> void test()
> {
> MyClass a;
> MyClass b; // => says "potential memory leak
> }
>
> I understand why it happens and that the solution which avoids this is
> to specify identical name for each histograms. For example, I can give
> them identical names through arguments for a constructor. However if
> MyClass has many histograms and they need to be initialize in the
> default constructor, the default constructor will become messy.
>
> MyClass(const char* name1, const char* name2, /*continue*/) : TObject()
> {
> hist1 = TH1D(name1, name1, 1, 0, 1);
> hist2 = TH1D(name2, name2, 1, 0, 1);
> // continue
> }
>
> I would like to know how do you implement your application in this case.
> Is there any standard method ?
>
> Sincerely,
>
> OKUMURA, Akira oxon_at_icrr.u-tokyo.ac.jp
> Institute for Cosmic Ray Research, University of Tokyo
> 5-1-5 Kashiwanoha Kashiwa Chiba 277-8582 Japan
> Phone/Fax : +81 4-7136-3153
> Skype : okumura.akira
>
Received on Thu Jun 15 2006 - 10:03:25 MEST
This archive was generated by hypermail 2.2.0 : Mon Jan 01 2007 - 16:31:59 MET