cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

[[nodiscard]] для std::unique_ptr::release , новый метод std::unique_ptr::forget_ownership #333

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +5, -1 Автор идеи: ilnurkh

release и reset очень похожи, часто их начаянно путают получая утечки

предлагается поставить параметр [[nodiscard]] для release чтобы было сложнее не заметить потерю владения

для того чтобы использовать release для специаольной отмены владиния предлагается добавить метод void std::unique_ptr::forget_ownership() { auto tmp = this->release(); (void)(tmp);}

Можно сделать это же ещё и для других типов указателей.

apolukhin commented 3 years ago

yndx-antoshkka, 26 июля 2018, 15:27 Ещё надо добавить для guardов.

Надо будет писать proposal. Готовы? Есть желающие?

Andrey, 26 июля 2018, 15:33 yndx-antoshkka, для guard'ов нельзя, есть желающие программировать в таком стиле:

class MyThreadSafeClass {
  std::mutex mutex_;

public:
  std::unique_lock<std::mutex> do_something_under_lock()
  {
     std::unique_lock lock(mutex_);
     do_something();
     return lock;
  }

  void do_other_thing();
};

void use1(MyThreadSafeClass x)
{
  auto lock = x.do_something_under_lock();
  x.do_other_thing();
}

void use2(MyThreadSafeClass x)
{
  x.do_something_under_lock(); // lock is discarded, but it's not an error
}

yndx-antoshkka, 26 июля 2018, 16:14 Andrey, я имел в виду только метод release() для всех guard

Andrey, 26 июля 2018, 17:02 yndx-antoshkka, понял, то есть, получается речь идет только об unique_lock::release(), больше, в стандартной библиотеке пока нет guard'ов с методом release()?

Andrey, 26 июля 2018, 15:29 Идея была рассмотрена тут: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0600r1.pdf но отвергнута.

yndx-antoshkka, 26 июля 2018, 16:15 Andrey, идея была принята в том виде что изложено в бумаге. Но ни в бумаге, ни при обсуждении речь не заходила о методах release().

Так что надо писать новую бумагу, на добавлние [[nodiscard]] к release() методам умных указателей и guardов

Andrey, 26 июля 2018, 16:49 yndx-antoshkka, в бумаге сказано про unique_ptr::release(), что к нему добавлять [[nodiscard]] не предлагается, потому что в Google в 3.5% результат unique_ptr::release() дискардится но это все не баги.

yndx-antoshkka, 26 июля 2018, 17:17 Andrey, и правда, этот момент я проглядел. Спасибо!

Тогда бессмысленно в ближайшее время опять поднимать этот вопрос.

Саша Зайцев, 27 июля 2018, 23:15 yndx-antoshkka, сложно будет пробить, если есть примеры на кодовой базе. Вот если бы были доказательства обратного... то тогда было бы легче. Можно было бы сделать по аналогии с исследованием о привнесении багов при изменении if(a < b < c)