Использование 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);
}