diff --git a/vowpalwabbit/parse_args.cc b/vowpalwabbit/parse_args.cc index 1aee3134d55..4d766398002 100644 --- a/vowpalwabbit/parse_args.cc +++ b/vowpalwabbit/parse_args.cc @@ -183,7 +183,8 @@ void parse_dictionary_argument(vw&all, string str) THROW("error: cannot re-read dictionary from file '" << fname << "'" << ", opening failed"); } - feature_dict* map = new feature_dict(1023, nullptr, substring_equal); + feature_dict* map = &calloc_or_throw(); + map->init(1023, nullptr, substring_equal); example *ec = VW::alloc_examples(all.p->lp.label_size, 1); size_t def = (size_t)' '; @@ -941,7 +942,8 @@ void parse_example_tweaks(arguments& arg) if (arg.vm.count("named_labels")) { - arg.all->sd->ldict = new namedlabels(named_labels); + arg.all->sd->ldict = &calloc_or_throw(); + new (arg.all->sd->ldict) namedlabels(named_labels); if (!arg.all->quiet) arg.trace_message << "parsed " << arg.all->sd->ldict->getK() << " named labels" << endl; } @@ -1584,7 +1586,11 @@ void finish(vw& all, bool delete_all) seeded = false; if (!seeded) { - delete(all.sd->ldict); + if (all.sd->ldict) + { + all.sd->ldict->~namedlabels(); + free(all.sd->ldict); + } free(all.sd); } all.reduction_stack.delete_v(); @@ -1606,7 +1612,7 @@ void finish(vw& all, bool delete_all) all.loaded_dictionaries[i].dict->iter(delete_dictionary_entry); all.loaded_dictionaries[i].dict->delete_v(); - delete all.loaded_dictionaries[i].dict; + free(all.loaded_dictionaries[i].dict); } delete all.loss; diff --git a/vowpalwabbit/v_hashmap.h b/vowpalwabbit/v_hashmap.h index 428e6ce2071..63b176f407d 100644 --- a/vowpalwabbit/v_hashmap.h +++ b/vowpalwabbit/v_hashmap.h @@ -38,7 +38,7 @@ template class v_hashmap void set_default_value(V def) { default_value = def; } void init_dat(size_t min_size, V def, bool (*eq)(void*,K&,K&), void *eq_dat = nullptr) - { dat = v_init(); + { if (min_size < 1023) min_size = 1023; dat.resize(min_size, true); // resize sets to 0 ==> occupied=false @@ -52,7 +52,7 @@ template class v_hashmap } void init(size_t min_size, V def, bool (*eq)(K&,K&)) - { dat = v_array(); + { if (min_size < 1023) min_size = 1023; dat.resize(min_size); // resize sets to 0 ==> occupied=false @@ -66,7 +66,7 @@ template class v_hashmap } void init(size_t min_size, bool (*eq)(K&,K&)) - { dat = v_array(); + { if (min_size < 1023) min_size = 1023; dat.resize(min_size); // resize sets to 0 ==> occupied=false