Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey@blender.org>2020-10-12 11:46:31 +0300
committerSergey Sharybin <sergey@blender.org>2020-10-12 16:12:17 +0300
commitdf5b65811e4ebbe02524c94defdf7be4ae0275ba (patch)
treea00b1eefd8320a2f0ac0c8da3789cbca76dfa0b3 /intern/libmv
parent590220e451c370f21c0742d2bef99f7d632434c7 (diff)
Libmv: Fix memory leak in modal solver
The leak was happening when problem did not have any parameters blocks defined. This happens, for example, if there are no 3D points at all, or when all markers are set to 0 weight. Was noticeable in libmv_modal_solver_test when building with LSAN enabled.
Diffstat (limited to 'intern/libmv')
-rw-r--r--intern/libmv/libmv/simple_pipeline/modal_solver.cc9
1 files changed, 7 insertions, 2 deletions
diff --git a/intern/libmv/libmv/simple_pipeline/modal_solver.cc b/intern/libmv/libmv/simple_pipeline/modal_solver.cc
index 6c1a983df35..f801518271c 100644
--- a/intern/libmv/libmv/simple_pipeline/modal_solver.cc
+++ b/intern/libmv/libmv/simple_pipeline/modal_solver.cc
@@ -175,8 +175,9 @@ void ModalSolver(const Tracks &tracks,
// STEP 2: Refine rotation with Ceres.
ceres::Problem problem;
- ceres::LocalParameterization* quaternion_parameterization =
- new ceres::QuaternionParameterization;
+ // NOTE: Parameterization is lazily initialized when it is really needed,
+ // and is re-used by all parameters block.
+ ceres::LocalParameterization* quaternion_parameterization = NULL;
int num_residuals = 0;
for (int i = 0; i < all_markers.size(); ++i) {
@@ -195,6 +196,10 @@ void ModalSolver(const Tracks &tracks,
&quaternion(0));
num_residuals++;
+ if (quaternion_parameterization == NULL) {
+ quaternion_parameterization = new ceres::QuaternionParameterization();
+ }
+
problem.SetParameterization(&quaternion(0),
quaternion_parameterization);
}