0

私はpagePtr.hにこのようなものを持っています

typedef int (*FunPtrType)(char* sz, unsigned int max_bytes, char* arg1,
char* arg2, char* arg3, char* arg4);

オブジェクトを作成する静的関数

static pagePtr* CreatePage( FunPtrType Ptr2Fun)
{
    return new pagePtr(ptr2Fun);
}

boost::scoped_ptr を使用すると、作成されたものを後で削除する心配がなくなります。はいの場合、この場合はどのように実装すればよいですか。また、作成されたオブジェクトを削除するために、利用可能な場合は、他に考えられるより良いオプションは何でしょうか。

4

2 に答える 2

5

boost:scoped_ptrコピー不可ですので返品不可CreatePage()です。C++11 が利用可能な場合は、次のstd::unique_ptrように使用できます。

static std::unique_ptr<pagePtr> CreatePage( FunPtrType Ptr2Fun)
{
    return std::unique_ptr<pagePtr>(new pagePtr(ptr2Fun));
}

pagePtrコピーできない理由はありますか?そうでなく、コピーするのに費用がかからない場合は、値で返します。

pagePtrがコピーstd::unique_ptr不可で利用できない場合はboost::shared_ptr、返された を破壊する責任を呼び出し元から取り除くために使用できますpagePtrshared_ptr使用は単独の所有権を示すものではなく、不要な参照カウントの代償を払うという欠点があります (使用可能なスマート ポインターの詳細と説明については、What C++ Smart Pointer Implementations are available?を参照してください)。

投稿されたコードからpagePtr、関数ポインターのラッパーに見えるため、boost::function代わりにコピー可能な使用を検討し、pagePtr完全に削除します。

typedef boost::function<int(char* sz,
                            unsigned int max_bytes,
                            char* arg1,
                            char* arg2,
                            char* arg3,
                            char* arg4)> FunPtrType;
于 2013-03-05T13:47:55.920 に答える
3

オブジェクトを動的に割り当て、呼び出し元に安全に所有権を返す関数を持つためのイディオムは、 a を返すことstd::unique_ptrです:

std::unique_ptr<foo> create_foo()
{
  return std::unique_ptr<foo>(new foo());
}

これは、オブジェクトの所有権を取得していること、およびオブジェクトが破棄されるとオブジェクトが破棄されることを呼び出し元に明示的に伝えますstd::unique_ptr(所有権がさらに別の場所に渡されない限り)。

あなたの例に適用されます:

static std::unique_ptr<pagePtr> CreatePage( FunPtrType ptr2Fun)
{
    return std::unique_ptr<pagePtr>(new pagePtr(ptr2Fun));
}

他のポインターが適用されない理由については、次のとおりです。

  • boost::scoped_ptr所有権をまったく渡すことができません - これはスマート ポインターの中で最も制限的です ( a とほとんど同じですconst std::unique_ptr) 。
  • std::auto_ptrコピーによる移動セマンティクスを提供するため、非推奨です
  • std::shared_ptr機能しますが、あまり意味がありません-関数が終了しているため、関数は呼び出し元と所有権を共有しません
于 2013-03-05T13:47:51.843 に答える