Использование boost :: shared_ptr с WSACleanup - PullRequest
1 голос
/ 11 октября 2011

Я хотел бы использовать 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 ]

1 голос
/ 11 октября 2011

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

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

....

void DoSomething() {
    WSAStartup(...);
    boost::shared_ptr<A> x(new A);
}
1 голос
/ 11 октября 2011

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

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

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