Я бы предпочел просто увидеть это как кортеж двойников (или их массив); он удаляет все догадки, созданные кортежем указателей на удвоения.
Вместо того, чтобы думать об этом как о потенциальной утечке, подумайте об этом с точки зрения права собственности. Когда вы объявляете локальную переменную типа double
, она принадлежит стеку, и она будет очищена. Когда вы создаете один из типов double*
, стек владеет указателем, но не владеет значением, поэтому значение не может быть очищено. Ясно, что просто объявить double
проще и легче, поэтому, если есть такая возможность, предпочтите ее.
Теперь рассмотрим других потенциальных владельцев. Кортеж, содержащий типы POD, такие как std::tuple<double, double>
, будет владеть и затем очищать двойники, но кортеж, содержащий тип указателя, не ясен. Очистка std::tuple<double*, double*>
не очистит двойников. Очевидно, что просто использовать кортеж двойников проще и легче, поэтому, если это вариант, предпочитайте его.
Но я предполагаю, что по разным причинам вам нужно использовать кортеж указателей на удвоение.
Затем подумайте, какое время жизни вам нужно для ваших базовых данных. Как вы можете получить эту жизнь? Можете ли вы передать право собственности на двойники чему-то другому, что будет очищено в нужное время, и сохранить их адреса в указателях кортежа, не являющихся владельцами, на двойники? Например, ваша лямбда захватывает внешний контейнер по ссылке, помещает в него свои двойники и сохраняет только их адреса в кортежах.
Вот попытка показать, что я имею в виду... но будьте осторожны, делая это с вектором, как я его показываю. Я ничего не знаю о hpx::parallel::reduce
, но полагаю, что его параллельная природа сделает эту упрощенную версию совершенно небезопасной. Два чередующихся вызова push_back
и back
приведут к созданию некорректных кортежей; два перекрывающихся вызова push_back
могут легко повредить вектор. Более сложная версия может синхронизировать использование контейнера.
std::vector<double> v; // XXX: probably unsafe for parallel reduce
boost::tuple<double*,double*> res = hpx::parallel::reduce(hpx::parallel::par,
iter, iter+4,
boost::make_tuple<double*,double*>(g,h), [&v](reference a, reference b) {
v.push_back(*boost::get<1>(b) * *boost::get<0>(b));
return boost::make_tuple<double*,double*>(&v.back(), &v.back()); });
person
Michael Urman
schedule
02.07.2014
new()
без соответствующего удаления вызовет утечку памяти. Используйте умные указатели, как предложил @NeilKirk. - person πάντα ῥεῖ   schedule 03.07.2014boost::scoped_ptr<double>
, это сработает? Или он будет освобожден в конце лямбда-функции - person Syntactic Fructose   schedule 03.07.2014