Если вы используете shared_ptr
, это не совсем классический прыщ
идиома (если вы не предпримите дополнительные шаги). Но настоящий вопрос
вот почему вы хотите использовать умный указатель для начала; это очень
ясно, где должно произойти delete
, и нет никаких проблем с
исключение безопасности или другое, чтобы иметь дело с. В большинстве,
умный указатель сэкономит вам одну или две строки кода. И
единственная, которая имеет правильную семантику, является boost::scoped_ptr
,
и я не думаю, что это работает в этом случае. (IIRC, требуется
полный тип, чтобы быть реализованным, но я мог бы быть
неправильно.)
Важным аспектом идиомы pimpl является то, что его использование должно быть
прозрачно для клиента; класс должен вести себя так, как если бы
это было реализовано классически. Это означает либо подавление
копировать и присваивать или реализовывать глубокое копирование, если класс
является неизменным (без неконстантных функций-членов). Ни один из обычных
умные указатели реализуют глубокое копирование; Вы могли бы реализовать один, из
Конечно, но это, вероятно, все еще потребует полного типа
всякий раз, когда происходит копирование, это означает, что вам все равно придется
предоставить пользовательский конструктор копирования и оператор присваивания
(так как они не могут быть встроенными). Учитывая это, это, вероятно, не
стоит потрудиться, используя умный указатель.
Исключение составляют объекты, которые являются неизменяемыми. В этом случае это
не имеет значения, глубокая копия или нет, и shared_ptr
полностью справляется с ситуацией.