Skip to content

Commit f129fab

Browse files
authored
Merge pull request OpenSees#1746 from parched/fiber-memory-leak
Fix memory leak with fiber section
2 parents d67fc0d + c2e0004 commit f129fab

2 files changed

Lines changed: 27 additions & 16 deletions

File tree

SRC/material/section/TclModelBuilderSectionCommand.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1811,9 +1811,10 @@ buildSection(Tcl_Interp *interp, TclModelBuilder *theTclModelBuilder,
18111811

18121812
//SectionForceDeformation *section = new FiberSection(secTag, numFibers, fiber);
18131813

1814-
// Delete fibers created for patches and layers
1815-
for (i = numSectionRepresFibers; i < numFibers; i++)
1816-
delete fiber[i];
1814+
// Delete temporary fibers created from patches/layers. Fibers added
1815+
// explicitly via the `fiber` command are owned by FiberSectionRepr.
1816+
for (i = numSectionRepresFibers; i < numFibers; i++)
1817+
delete fiber[i];
18171818

18181819
if (section == 0)
18191820
{
@@ -1869,9 +1870,10 @@ buildSection(Tcl_Interp *interp, TclModelBuilder *theTclModelBuilder,
18691870
else
18701871
section = new FiberSection3d(secTag, numFibers, fiber, theTorsion, currentSectionComputeCentroid);
18711872

1872-
// Delete fibers
1873-
for (i = numSectionRepresFibers; i < numFibers; i++)
1874-
delete fiber[i];
1873+
// Delete temporary fibers created from patches/layers. Fibers added
1874+
// explicitly via the `fiber` command are owned by FiberSectionRepr.
1875+
for (i = numSectionRepresFibers; i < numFibers; i++)
1876+
delete fiber[i];
18751877

18761878
if (section == 0)
18771879
{
@@ -2070,11 +2072,11 @@ buildSectionInt(Tcl_Interp *interp, TclModelBuilder *theTclModelBuilder,
20702072

20712073
SectionForceDeformation *section = new FiberSection2dInt(secTag, numFibers, fiber, numHFibers, Hfiber, NStrip1, t1, NStrip2, t2, NStrip3, t3);
20722074

2073-
// Delete fibers
2074-
for (i = 0; i < numFibers; i++)
2075+
// Delete temporary fibers created from patches/layers only.
2076+
for (i = numSectionRepresFibers; i < numFibers; i++)
20752077
delete fiber[i];
20762078

2077-
for (i = 0; i < numHFibers; i++)
2079+
for (i = numSectionRepresHFibers; i < numHFibers; i++)
20782080
delete Hfiber[i];
20792081

20802082
if (section == 0)
@@ -2120,8 +2122,8 @@ buildSectionInt(Tcl_Interp *interp, TclModelBuilder *theTclModelBuilder,
21202122
SectionForceDeformation *section = 0;
21212123
section = new FiberSection3d(secTag, numFibers, fiber, theTorsion, currentSectionComputeCentroid);
21222124

2123-
// Delete fibers
2124-
for (i = 0; i < numFibers; i++)
2125+
// Delete temporary fibers created from patches/layers only.
2126+
for (i = numSectionRepresFibers; i < numFibers; i++)
21252127
delete fiber[i];
21262128

21272129
if (section == 0)

SRC/material/section/repres/section/FiberSectionRepr.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,21 @@ FiberSectionRepr::~FiberSectionRepr(void)
155155
delete [] reinfLayer;
156156
}
157157

158-
if (theFibers != 0)
159-
delete [] theFibers; // NOTE: don't delete fiber objects themselves
160-
// leave this to FiberSection destructor
158+
if (theFibers != 0) {
159+
for (i = 0; i < numFibers; i++)
160+
if (theFibers[i])
161+
delete theFibers[i];
161162

162-
if (theHFibers != 0)
163-
delete [] theHFibers; // NOTE: don't delete fiber objects themselves
163+
delete [] theFibers;
164+
}
165+
166+
if (theHFibers != 0) {
167+
for (i = 0; i < numHFibers; i++)
168+
if (theHFibers[i])
169+
delete theHFibers[i];
170+
171+
delete [] theHFibers;
172+
}
164173

165174
}
166175

0 commit comments

Comments
 (0)