diff --git a/src/user/user_model.cc b/src/user/user_model.cc index 50f37bf8..c1b1b3ae 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -1072,6 +1072,14 @@ void mjCModel::DeleteAll(std::vector& elements) { elements.clear(); } +template <> +void mjCModel::DeleteAll(std::vector& elements) { + for (mjCKey* element : elements) { + delete element; + } + elements.clear(); +} + // set nuser fields void mjCModel::SetNuser() { if (nuser_body == -1) { diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index 4260da3c..6cbfa6e4 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -860,6 +860,9 @@ mjCBody& mjCBody::operator+=(const mjCFrame& other) { // attach referencing elements *model += *other.model; + // (b/350784262) delete keyframes + model->DeleteAll(model->keys_); + // clear namespace and return body other.model->prefix.clear(); other.model->suffix.clear(); @@ -1598,6 +1601,9 @@ mjCFrame& mjCFrame::operator+=(const mjCBody& other) { // attach referencing elements *model += *other.model; + // (b/350784262) delete keyframes + model->DeleteAll(model->keys_); + // clear suffixes and return other.model->suffix.clear(); other.model->prefix.clear();