私はcとcppを含む大きなアプリケーションで作業しています。すべてのファイルはcpp拡張子として保存されますが、コードはc-スタイルで記述されています。つまり、malloc、realloc、callocを介してメモリをクラス割り当てするのではなく、構造を定義することです。最近、Boostライブラリがインストールされているので、既存のコードベースに使用する予定です。次の質問があります。
または言い換えれば:
次のコードで、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));
Mallocと無料でshared_ptrを使用できますか?.
はい。
誰かが私にサンプルコードベースを指摘できますか?.
デフォルトのfree
ではなくdelete
を使用してメモリが解放されるように、カスタム削除機能を提供する必要があります。これは、free
関数自体へのポインタである可能性があります。
_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
を使用して解放されるメモリを返すその他のもので初期化するのは問題ありません。 _shared_ptr
_が元のポインターの所有権を取得し、realloc
を呼び出さないと解放されないため、free
を使用することはできません。
_std::shared_pointer
_をmalloc()
およびfree()
とともに使用するには、カスタム削除機能を指定する必要があります。これはそれを行う必要があります
_std::shared_ptr<T> ptr(static_cast<T*>(malloc(sizeof(T))), free);
_
std::shared_ptr<T>::get()
の結果を渡さない限り、ポインタは安全です。
編集:malloc()
の結果を_T*
_にキャストすることを追加しました。
Mallocと無料でshared_ptrを使用できますか?はいの場合誰かが私にサンプルコードベースを指摘できますか?.
はい。 shared_ptr
はメモリ自体を割り当てません。ただし、参照カウントがゼロになると、オブジェクトは削除されます。デフォルトではdelete
を使用し、malloc
(またはその他の方法)によって割り当てられたオブジェクトでは使用できないため、 カスタム削除機能 を使用する必要があります。
アプリケーションでshared_ptrを作成し、mallocまたはcallocを使用している場合は、このポインターを別の関数に渡します。機能に影響しますか?.
ここで何を求めているのかは明確ではありません。その関数が共有ポインタが渡されることを期待しない場合は、特別な注意を払う必要があります。しかし、それはその関数が実際に何をするかに依存します。
ダブルポインタを受け入れ、アプリケーション内の構造を埋めてmallocを使用する関数を呼び出しました。これらのポインタをshared_ptrに割り当てることはできますか。
はい、shared_ptr
で任意のポインタを使用できます。