Использование boost::shared_ptr с WSACleanup

Я хотел бы использовать boost::shared_ptr для вызова WSACleanup(), когда моя функция выходит из области видимости, например так:

void DoSomething() {
    WSAStartup(...);
    boost::shared_ptr<void> WSACleaner(static_cast<void*>(0), WSACleanup);
}

Это не компилируется,

Error 1 error C2197: 'int (__stdcall *)(void)' : too many arguments for call C:\projects\svn-5.3\ESA\Common\include\boost\detail\shared_count.hpp 116

Какие-нибудь мысли?

2 ответа

Решение

Из документов: "Выражение d(p) должно быть правильно сформировано" (т.е. WSACleanup(static_cast<void*>(0) должен быть хорошо сформирован.)

Одно из возможных решений:

boost::shared_ptr<void> WSACleaner(static_cast<void*>(0),
                                   [](void* dummy){WSACleanup();});

Вы можете создать класс Aкакой деструктор вызывает WSACleanup и экземпляр shared_ptr с ним:

class A
{
    public:
        ~A() { WSACleanup(...); }
}

....

void DoSomething() {
    WSAStartup(...);
    boost::shared_ptr<A> x(new A);
}
Другие вопросы по тегам