auto_ptr
и shared_ptr
решают совершенно разные задачи. Одно не заменяет другое.
auto_ptr
- это тонкая оболочка вокруг указателей для реализации семантики RAII , так что ресурсы всегда высвобождаются даже при возникновении исключений. auto_ptr
не выполняет никакого подсчета ссылок и т. П., Не заставляет несколько указателей указывать на один и тот же объект при создании копий. На самом деле, это очень разные. auto_ptr
- один из немногих классов, где оператор присваивания изменяет объект source . Рассмотрим этот бесстыдный плагин со страницы auto_ptr википедии :
int *i = new int;
auto_ptr<int> x(i);
auto_ptr<int> y;
y = x;
cout << x.get() << endl; // Print NULL
cout << y.get() << endl; // Print non-NULL address i
Обратите внимание, как выполняется
y = x;
изменяет не только у, но и х.
Шаблон boost::shared_ptr
позволяет легко обрабатывать несколько указателей на один и тот же объект, и объект удаляется только после того, как последняя ссылка на него вышла из области видимости. Эта функция бесполезна в вашем сценарии, который (пытается) реализовать Singleton . В вашем сценарии всегда есть 0 ссылок на 1 ссылку на единственный объект класса, если таковой имеется.
В сущности, auto_ptr
объекты и shared_ptr
объекты имеют совершенно разную семантику (поэтому вы не можете использовать первое в контейнерах, но делать это с последним хорошо), и я уверен, что у вас есть хорошие тесты для отлова любые регрессии, которые вы ввели при переносе кода. : -}