std::auto_ptr
не работает в VC++ 8 (это то, что мы используем на работе). Моя главная претензия к этому заключается в том, что он позволяет auto_ptr<T> x = new T();
, что, конечно, приводит к ужасным сбоям, хотя его легко сделать по ошибке.
Из ответа на еще один вопрос здесь, в stackoverflow:
Обратите внимание, что реализация std::auto_ptr в Visual Studio 2005 ужасно сломана. http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98871 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842
я хочу использовать
boost::scoped_ptr
для указателей, которые не должны передавать права собственности.boost::shared_ptr
для указателей в контейнерах и других местах, где они требуются.std::auto_ptr
для указателей, которые должны/могут передавать право собственности.
Но поскольку std::auto_ptr
для меня не работает, мне интересно, какой подход будет лучшим:
- Замените
std::auto_ptr
чем-нибудь из сети. Как этот это от Рани Шарони (еще не пробовал это еще). - Вместо этого используйте
boost::shared_ptr
. Конечно, будет работать, хотя будут небольшие накладные расходы, которые меня не волнуют. Но я хочу использоватьauto_ptr
, чтобы сигнализировать о намерении указателя. (См. этот ответ для голосования по этому подходу. .) - На практике мне никогда не понадобится передавать право собственности, поэтому мне не стоит об этом беспокоиться.
Обновление: вот что я сделал: я скопировал вышеупомянутую реализацию auto_ptr Рани Шарони. Отсюда.
Сделал небольшие тесты:
class T
{
public:
T() {
OutputDebugStringA("T\n");
};
~T() {
OutputDebugStringA("~T\n");
};
};
{
fix::auto_ptr<T> x(new T); // This just works.
}
{
fix::auto_ptr<T> x = (new T); // Doesn't compile. Great!
}
{
fix::auto_ptr<T> x = fix::auto_ptr<T>(new T); // Transfer of ownership works also.
}
Конечно, эти тесты ни в коем случае не являются исчерпывающими, и доверять им не стоит. Реализация шаблонного класса, безопасного для исключений, — дело непростое. По крайней мере, это работает лучше, чем встроенный.
Примечание: я не знаю, разрешено ли мне использовать эту реализацию в отношении авторских прав. Написал Рани, жду ответа. Я обновлю этот пост, когда узнаю больше. Разрешено всем использовать реализацию auto_ptr Рани Шарони по своему усмотрению.
Спасибо за все ваши ответы.