2016-11-17 3 views
0

私は新しいライブラリのために私の仕事でこれを探検し始めました。私はBOOSTのscoped_ptrがどのように機能するのか理解したいですか?これまではすべてのコードでローポインタを使用していましたが、SmartPointerを使用してメモリ管理を容易にすることができました。私たちのプログラミングは純粋なC++言語ではなく、統合されたアプリケーション言語です。たとえば、scoped_ptrをNULLに初期化して、生のポインタをアプリケーションAPIに渡す方法を理解しようとしています。boost:入力タイプとしてchar *を取るレガシーC関数を使ったscoped_ptr?

これ以下のコードは、それが公開されていないので、私はAPIを変更することはできません。この

int SOME_API_FUNC(int obj, const char* prop, char** cValue); 

のような引数を取りアプリケーションツールキットのAPIで考えてみましょう。

パラメータcValueは、APIがダイナミックにメモリを割り当てて値を割り当てて返すので、メモリ管理が自動化されるようにSmart Pointerを使用する場所です。このcValueが内部API内のmallocに割り当てられている場合は私の質問がある

SOME_API_FUNC(obj, prop,&*cValue); 

のようなこの

boost::scoped_ptr<char*> pcValue(new char*()); 

とAPIで使用されるように我々はそれを宣言するscoped_ptrをしてみました

scoped_ptrが使用されてから何が起こるのですかを削除しますか? を削除すると、は正しくメモリをクリーンアップできますか?メモリが適切にクリーンアップされたことを確認するには?

+0

C++質問のタグ?彼らは異なる言語です! – Olaf

答えて

1

カスタマイズ可能な削除機能を備えたスマートポインタを使用する必要があります。

など。あなたがfree代わりのdelete(デフォルト削除手段)とそのポインタを解放する必要がある場合は、試してみてください。

struct free_deleter { 
    template <typename T> void operator()(T* p) const { 
     ::free(p); 
    } 
}; 
template <typename T> using malloc_ptr = std::unique_ptr<T, free_deleter>; 

今、あなたが実際にmallocで割り当てられ、ポインタを割り当て、細かいことができます:あなたがCを使用するすべての理由を

std::unique_ptr<char[]> a(new char[100]); // ok, uses `delete[]` 
std::unique_ptr<MyType> b(new MyType("param")); // ok, uses `delete` 

malloc_ptr<char> legacy_buf(static_cast<char*>(::malloc(100))); //ok, uses `::free` 
関連する問題