Иногда мне нужны экземпляры shared_ptr
, у которых есть no-op deleter, потому что API ожидает экземпляр shared_ptr
, который он хочет хранить в течение ограниченного времени, но мне предоставляется необработанный указатель, которому мне не разрешено владеть на какое-то время больше, чем я бегу.
В этом случае я использую no-op deleter, например [](const void *){}
, но сегодня я обнаружил, что есть другая альтернатива этому, используя (или злоупотребляя?) конструктор псевдонимов shared_ptr
:
void f(ExpectedClass *ec) {
std::shared_ptr<ExpectedClass> p(std::shared_ptr<void>(), ec);
assert(p.use_count() == 0 && p.get() != nullptr);
apiCall(p);
}
Мой вопрос: какой лучший способ сделать это и почему? Ожидаются ли ожидания производительности? С отсутствующим оператором я ожидаю оплатить некоторую стоимость хранения делетера и счетчика ссылок, что, похоже, не имеет места при использовании конструктора псевдонимов с пустым shared_ptr
.