将boost :: shared_ptr与WSACleanup一起使用

时间:2011-10-11 12:10:29

标签: c++ boost wsastartup 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 个答案:

答案 0 :(得分:1)

来自文档:“表达式d(p)必须是格式良好的”(即WSACleanup(static_cast<void*>(0)必须格式良好。)

一种可能的解决方案:

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

答案 1 :(得分:1)

您可以创建一个类A,析构函数可以使用WSACleanup和shared_ptr实例:

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

....

void DoSomething() {
    WSAStartup(...);
    boost::shared_ptr<A> x(new A);
}