web-dev-qa-db-ja.com

mallocと無料のshared_ptr

私はcとcppを含む大きなアプリケーションで作業しています。すべてのファイルはcpp拡張子として保存されますが、コードはc-スタイルで記述されています。つまり、malloc、realloc、callocを介してメモリをクラス割り当てするのではなく、構造を定義することです。最近、Boostライブラリがインストールされているので、既存のコードベースに使用する予定です。次の質問があります。

  1. Std :: shared_ptrをmallocおよびfreeで使用できますか?.
  2. はいの場合、誰かが私にサンプルコードベースを指摘できますか?
  3. アプリケーションでstd :: shared_ptrを作成し、このポインターをmallocまたはcallocを使用する別の関数に渡すと、機能に影響しますか?

または言い換えれば:

次のコードで、std :: shared_ptrを使用して同様の機能を実現するにはどうすればよいですか。

void allocateBlocks(int **ptr, int *cnt)
{
    *ptr = (int*)malloc(sizeof(int) * 10);
    *cnt = 10;
    /*do something*/ 
}

int main()
{
    int *p = NULL;
    int count = 0;
    allocateBlocks(&p, &count);
    /*do something*/

    free(p);
}

いくつかの関数を呼び出します。これらの関数は、ダブルポインターを受け入れ、アプリケーション内の構造を埋めて、mallocを使用します。それらのポインタをstd :: shared_ptrに割り当てることはできますか?例えば:

typedef struct txn_s
{
    int s;
    int d;
    int *e;
} txn_t;

typedef boost::shared_ptr<txn_t> tpointer;

tpointer((txn_t*)::malloc(sizeof(txn_t),::free));
23
user765443

Mallocと無料でshared_ptrを使用できますか?.

はい。

誰かが私にサンプルコードベースを指摘できますか?.

デフォルトのfreeではなくdeleteを使用してメモリが解放されるように、カスタム削除機能を提供する必要があります。これは、free関数自体へのポインタである可能性があります。

_shared_ptr<void> memory(malloc(1024), free);
_

mallocfreeは生のメモリのみを処理し、そのメモリに保持したい重要なオブジェクトを正しく作成および破棄する責任があることに注意してください。

アプリケーションでshared_ptrを作成し、mallocまたはcallocを使用している場合は、このポインターを別の関数に渡します。機能に影響しますか?.

私はその質問に完全には従いません。この_shared_ptr_は、「通常の」共有ポインターと交換可能に使用できます。 型消去ポインタのユーザーがさまざまな種類の削除機能の影響を受けないようにします。他の共有ポインタと同様に、get();を使用して生のポインタを抽出する場合は、少し注意する必要があります。具体的には、共有ポインタに所有権を取り消し不能に割り当てているため、freeする可能性のあることは何もしないでください。

ダブルポインタを受け入れ、アプリケーション内の構造を埋めてmallocを使用する関数を呼び出しました。これらのポインタをshared_ptrに割り当てることはできますか。

私はあなたが次のようなことを意味していると思います:

_double * make_stuff() {
   double * stuff = static_cast<double*>(malloc(whatever));
   put_stuff_in(stuff);
   return stuff;
}

shared_ptr<double> shared_stuff(make_stuff(), free);
_

更新:「ダブルポインター」というフレーズは見つかりませんでした。これは、Cスタイルでポインターを使用して、参照をエミュレートして戻り値をエミュレートすることを意味していると思います。あなたもそれを行うことができます:

_void make_stuff(double ** stuff);

double * stuff = 0;
make_stuff(&stuff);
shared_ptr<double> shared_stuff(stuff, free);
_

Reallocとcallocをどのように処理しますか

共有ポインタをcallocの結果、またはfreeを使用して解放されるメモリを返すその他のもので初期化するのは問題ありません。 _shared_ptr_が元のポインターの所有権を取得し、reallocを呼び出さないと解放されないため、freeを使用することはできません。

31
Mike Seymour

_std::shared_pointer_をmalloc()およびfree()とともに使用するには、カスタム削除機能を指定する必要があります。これはそれを行う必要があります

_std::shared_ptr<T> ptr(static_cast<T*>(malloc(sizeof(T))), free);
_

std::shared_ptr<T>::get()の結果を渡さない限り、ポインタは安全です。

編集:malloc()の結果を_T*_にキャストすることを追加しました。

4
Mehrwolf

Mallocと無料でshared_ptrを使用できますか?はいの場合誰かが私にサンプルコードベースを指摘できますか?.

はい。 shared_ptrはメモリ自体を割り当てません。ただし、参照カウントがゼロになると、オブジェクトは削除されます。デフォルトではdeleteを使用し、malloc(またはその他の方法)によって割り当てられたオブジェクトでは使用できないため、 カスタム削除機能 を使用する必要があります。

アプリケーションでshared_ptrを作成し、mallocまたはcallocを使用している場合は、このポインターを別の関数に渡します。機能に影響しますか?.

ここで何を求めているのかは明確ではありません。その関数が共有ポインタが渡されることを期待しない場合は、特別な注意を払う必要があります。しかし、それはその関数が実際に何をするかに依存します。

ダブルポインタを受け入れ、アプリケーション内の構造を埋めてmallocを使用する関数を呼び出しました。これらのポインタをshared_ptrに割り当てることはできますか。

はい、shared_ptrで任意のポインタを使用できます。

1
user405725