Wednesday, November 16, 2011

Custom Deleter - shared_ptr<> vs unique_ptr<>

Раньше можно было делать так:

// shared_ptr< > way
LPWSTR lpName = NULL;
std::tr1::shared_ptr< WCHAR > spName( (
    spItem->GetDisplayName( SIGDN_FILESYSPATH, &lpName ), lpName ),
        CoTaskMemFree );

Теперь можно и вот так:

// unique_ptr< > way
typedef void ( __cdecl* _COM_DELETER )( LPVOID );

LPWSTR lpName = NULL;
std::unique_ptr< WCHAR, _COM_DELETER > spName( (
    spItem->GetDisplayName( SIGDN_FILESYSPATH, &lpName ), lpName ),
        CoTaskMemFree );

В случае с unique_ptr< > нет дополнительного оверхеда на счетчик и проверки-вызова делитера в рантайме, но теперь приходится указывать тип. А ещё можно делать такое:

std::unique_ptr< int[ ] > ar( new int[ 100 ] );

No comments:

Post a Comment