1

次のように、関数がスコープ外になったときにWSACleanup()が呼び出されるように、boost::shared_ptrを使用したいと思います。

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

何かご意見は?

4

2 に答える 2

1

Aデストラクタが呼び出すクラスと、それを使用WSACleanupしてshared_ptrのインスタンスを作成できます。

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

....

void DoSomething() {
    WSAStartup(...);
    boost::shared_ptr<A> x(new A);
}
于 2011-10-11T12:17:55.653 に答える
1

ドキュメントから:「式d(p)は整形式である必要があります」(つまりWSACleanup(static_cast<void*>(0)、整形式である必要があります)。

考えられる解決策の1つ:

boost::shared_ptr<void> WSACleaner(static_cast<void*>(0),
                                   [](void* dummy){WSACleanup();});
于 2011-10-11T12:14:40.170 に答える