В Современный C ++ стиль, есть две ключевые концепции:
- Владение
- Недействительность
Владение о владельце какого-либо объекта / ресурса (в данном случае экземпляр Device
).Различные std::unique_ptr
, boost::scoped_ptr
или std::shared_ptr
относятся к владению.
Nullity , однако, гораздо проще: он просто выражает, может ли данный объект быть нулевым, ине заботится ни о чем другом, и уж точно не о праве собственности!
Вы были правы , чтобы переместить реализацию вашего класса в сторону unique_ptr
(в целом), хотя вы можетевам нужен умный указатель с глубокой семантикой копирования, если ваша цель - реализовать PIMPL.
Это ясно говорит о том, что ваш класс является единоличным ответственным за этот фрагмент памяти и аккуратно разбирается со всеми различными способами утечки памятив противном случае.
С другой стороны, большинство пользователей ресурсов могут не заботиться о его владении.
Пока функция не сохраняетссылка на объект (сохраните его на карте или чем-то еще), тогда все, что имеет значение, это то, что время жизни объекта превышает продолжительность вызова функции.
Таким образом, выбираякак передать параметр зависит от его возможного Nullity :
- Never null?Передайте ссылку
- Возможно, ноль?Передайте указатель , простой пустой указатель или класс, подобный указателю (например, с ловушкой на нуле)