23

私はcとcppを含む大規模なアプリケーションで作業しています。すべてのファイルは cpp 拡張子として保存されますが、コードは c-style で記述されています。つまり、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));
4

3 に答える 3

32

shared_ptr を malloc と free で使用できますか。

はい。

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

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

shared_ptr<void> memory(malloc(1024), free);

malloc生のメモリのみを扱うことを覚えておいてくださいfree。そのメモリに保持したい重要なオブジェクトを正しく作成および破棄する責任があります。

アプリケーションで 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。は元のポインタの所有権を取得しており、 を呼び出さずに解放しないためrealloc、は使用できません。shared_ptrfree

于 2012-09-04T13:55:51.347 に答える
4

std::shared_pointerwithを使用するには、カスタムのデリータを指定する必要がありますmalloc()free()これでできるはず

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

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

編集:malloc() toの結果のキャストを追加しましたT*

于 2012-09-04T13:46:02.783 に答える
1

共有_ptrをmallocおよび無料で使用できますか?はいの場合、誰かが私にサンプルコードベースを指摘できますか?

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

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

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

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

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

于 2012-09-04T13:44:37.307 に答える