aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core/SolveTriangular.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2011-03-19 01:06:50 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2011-03-19 01:06:50 +0100
commit290205dfc049abc5a92c1191740b30fa91130ade (patch)
tree0d07fea8597fb5d7f023a23cce7cb0b240be84c2 /Eigen/src/Core/SolveTriangular.h
parent5991d247f9b167ed738ef95ead0b5ee9a0248edd (diff)
fix memory leak when a custom scalar throw an exception
Diffstat (limited to 'Eigen/src/Core/SolveTriangular.h')
-rw-r--r--Eigen/src/Core/SolveTriangular.h17
1 files changed, 5 insertions, 12 deletions
diff --git a/Eigen/src/Core/SolveTriangular.h b/Eigen/src/Core/SolveTriangular.h
index 7cbcf3d80..71e129c7f 100644
--- a/Eigen/src/Core/SolveTriangular.h
+++ b/Eigen/src/Core/SolveTriangular.h
@@ -74,26 +74,19 @@ struct triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,1>
// FIXME find a way to allow an inner stride if packet_traits<Scalar>::size==1
bool useRhsDirectly = Rhs::InnerStrideAtCompileTime==1 || rhs.innerStride()==1;
- RhsScalar* actualRhs;
- if(useRhsDirectly)
- {
- actualRhs = &rhs.coeffRef(0);
- }
- else
- {
- actualRhs = ei_aligned_stack_new(RhsScalar,rhs.size());
+
+ ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhs,rhs.size(),
+ (useRhsDirectly ? rhs.data() : 0));
+
+ if(!useRhsDirectly)
MappedRhs(actualRhs,rhs.size()) = rhs;
- }
triangular_solve_vector<LhsScalar, RhsScalar, typename Lhs::Index, Side, Mode, LhsProductTraits::NeedToConjugate,
(int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor>
::run(actualLhs.cols(), actualLhs.data(), actualLhs.outerStride(), actualRhs);
if(!useRhsDirectly)
- {
rhs = MappedRhs(actualRhs, rhs.size());
- ei_aligned_stack_delete(RhsScalar, actualRhs, rhs.size());
- }
}
};