Существует ли общий умный указатель, такой как auto_ptr и shared_ptr, который не нуждается в C ++ 0x? - PullRequest
8 голосов
/ 22 сентября 2010

Мне нужен интеллектуальный указатель без учета ссылок, который может сочетать некоторые полезные аспекты auto_ptr и shared_ptr.Я думаю, что C ++ 0x unique_ptr - это, в конечном счете, то, что мне нужно, но мне нужно что-то, что будет компилироваться в Visual Studio 2008 и Xcode (gcc 4.2).

Мне нужна следующая функциональность:

  • Используется в фабричных методах, так что право собственности передается при копировании (например, auto_ptr)
  • Поддерживает release() (как auto_ptr)
  • Может использоваться с предварительным объявлением (например,shared_ptr)

Итак, я полагаю, это действительно лучше auto_ptr.Есть ли что-нибудь, что делает это в бусте или где-то еще (примечание: у меня нет времени, чтобы обернуться вокруг Локи)?Или я должен просто свернуть свой собственный?

РЕДАКТИРОВАТЬ: Я только что читал больше о auto_ptr - похоже, вы можете использовать его с предварительными декларациями, если вы гарантируете, чтоЗаголовок класса включен в каждый файл .cpp, который ссылается на заголовок с помощью умного указателя (например, см. GotW ).Кто-нибудь получил какие-либо общие советы или практические рекомендации по этому вопросу?

EDIT2: причина, по которой shared_ptr неприемлема, заключается в том, что мне нужен метод release (), поскольку я исправляю некоторый унаследованный код, вводя фабричные методы,но он должен сосуществовать с некоторым кодом владения указателем вручную.Использование shared_ptr во всей кодовой базе было бы здорово, но огромная задача.

EDIT3: В конце концов, auto_ptr было достаточно для работы, как только я обнаружил причуды прямого включения.Было бы также интересно попробовать написать пользовательское средство удаления для shared_ptr, чтобы разрешить необязательное удаление указателя.

Ответы [ 3 ]

5 голосов
/ 22 сентября 2010

Редактировать: В моем первоначальном ответе я не понял, что boost::shared_ptr неприемлемо для вас (возможно, по соображениям производительности).

auto_ptr поддерживает, как вы заметили, предварительное объявление. Вы должны включить заголовок для ссылочного класса в тех местах, которые могут уничтожить объект, на который ссылается auto_ptr. Однако обратите внимание, что семантика auto_ptr немного странная и требует некоторой осторожности.

Ответы на следующий вопрос содержат больше информации, включая причину, по которой unique_ptr может быть реализовано только для C ++ 0x, поскольку для этого требуются ссылки на значения:

unique_ptr буст-эквивалент?

2 голосов
/ 22 сентября 2010

С помощью некоторого стандартного кода вы можете приблизительно unique_ptr в C ++ 03. Это не идеальная эмуляция. Например, вам понадобится пара более явных вызовов move, чтобы иметь возможность вернуть локальный unique_ptr.

2 голосов
/ 22 сентября 2010

C ++ TR1 (поддерживается современными GCC и Visual Studio) имеет встроенные shared_ptr и другие (см. Википедия) .Они в основном взяты из Boost , который работает практически для любого современного компилятора.

Если вам нужно строгое владение, вы можете проверить scoped_ptr.

...