Skip to content

Commit bda19e6

Browse files
pcanaldpiparo
authored andcommitted
[meta] Straighten ownership of TProtoClass.
This enables the ability of TROOT to delete TClass object without double deletes.
1 parent 6a98298 commit bda19e6

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

core/meta/inc/TProtoClass.h

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class TProtoClass: public TNamed {
8282
Long_t fProperty; // Class properties, see EProperties
8383
Long_t fClassProperty; // Class C++ properties, see EClassProperties
8484
Long_t fOffsetStreamer; // Offset to streamer function
85+
bool fOwner = true; //! True if owns its content, false if it got a reference to the TClass content.
8586

8687
TProtoClass(const TProtoClass &) = delete;
8788
TProtoClass &operator=(const TProtoClass &) = delete;

core/meta/src/TProtoClass.cxx

+13-7
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ TProtoClass::TProtoClass(TClass* cl):
5555
TNamed(*cl), fBase(cl->GetListOfBases()),
5656
fEnums(cl->GetListOfEnums()), fSizeof(cl->Size()), fCheckSum(cl->fCheckSum),
5757
fCanSplit(cl->fCanSplit), fStreamerType(cl->fStreamerType), fProperty(cl->fProperty),
58-
fClassProperty(cl->fClassProperty)
58+
fClassProperty(cl->fClassProperty), fOwner(false)
5959
{
6060
if (cl->Property() & kIsNamespace){
6161
//fData=new TListOfDataMembers();
@@ -168,15 +168,20 @@ TProtoClass::~TProtoClass()
168168

169169
void TProtoClass::Delete(Option_t* opt /*= ""*/)
170170
{
171-
if (fBase) fBase->Delete(opt);
172-
delete fBase; fBase = nullptr;
171+
if (fOwner && fBase) {
172+
fBase->Delete(opt);
173+
delete fBase; fBase = nullptr;
174+
}
173175

174-
for (auto dm: fData)
175-
delete dm;
176+
if (fOwner)
177+
for (auto dm: fData)
178+
delete dm;
176179
fData.clear();
177180

178-
if (fEnums) fEnums->Delete(opt);
179-
delete fEnums; fEnums = nullptr;
181+
if (fOwner && fEnums) {
182+
fEnums->Delete(opt);
183+
delete fEnums; fEnums = nullptr;
184+
}
180185

181186
if (gErrorIgnoreLevel==-2) printf("Delete the protoClass %s \n",GetName());
182187
}
@@ -261,6 +266,7 @@ Bool_t TProtoClass::FillTClass(TClass* cl) {
261266
cl->fName = this->fName;
262267
cl->fTitle = this->fTitle;
263268
cl->fBase = fBase;
269+
fBase = nullptr;
264270

265271
// fill list of data members in TClass
266272
//if (cl->fData) { cl->fData->Delete(); delete cl->fData; }

0 commit comments

Comments
 (0)