diff --git a/vowpalwabbit/feature_group.h b/vowpalwabbit/feature_group.h index 9aaf90f04c9..3aaecc85782 100644 --- a/vowpalwabbit/feature_group.h +++ b/vowpalwabbit/feature_group.h @@ -326,7 +326,7 @@ struct features { { copy_array(values, src.values); copy_array(indicies, src.indicies); free_space_names(0); - copy_array(space_names, src.space_names); + copy_array_no_memcpy(space_names, src.space_names); sum_feat_sq = src.sum_feat_sq; } }; diff --git a/vowpalwabbit/v_array.h b/vowpalwabbit/v_array.h index cf3daeac974..18034df30d3 100644 --- a/vowpalwabbit/v_array.h +++ b/vowpalwabbit/v_array.h @@ -168,6 +168,13 @@ template void copy_array(v_array& dst, const v_array& src) push_many(dst, src._begin, src.size()); } +// use to copy arrays of types with non-trivial copy constructors, such as shared_ptr +template void copy_array_no_memcpy(v_array& dst, const v_array& src) +{ dst.erase(); + for (T*item = src._begin; item != src._end; ++item) + dst.push_back(*item); +} + template void copy_array(v_array& dst, const v_array& src, T(*copy_item)(T&)) { dst.erase(); for (T*item = src._begin; item != src._end; ++item)