メモリ割り当てに calloc と malloc を使用する自作のハッシュテーブルを含むコードがあります。これらの部分を、割り当てられたメモリを自動的に解放するカスタム デリーターを備えた shared_ptr を使用して変更したいと考えています。このコードは、mmseg 中国語セグメンター アルゴリズムの一部であり、うまく機能していますが、メモリ リークが発生するため混乱しています。そのコードを unordered_map などを使って書き直すことを検討していますが、とりあえずこれらの変更を加えたいと思います。
shared_ptr with malloc and freeやAccessing calloc'd data through a shared_ptrなど、同様の質問に対する回答を読みましたが、以下のコードでそれを使用するには問題があります。
スマート ポインターで呼び出しをラップできないこれらの行があります。だから多分誰かがこれで私を助けることができます:
struct Word {
unsigned char nbytes; /* number of bytes */
char length; /* number of characters */
unsigned short freq;
char text[word_embed_len];
};
struct Entry {
Word *word;
Entry *next;
};
static Entry **new_bins = static_cast<Entry **>(std::calloc(init_size,
sizeof(Entry *)));
Entry *entry, ...;
...
new_bins[hash_val] = entry;
....
free(new_bins);
上記の calloc 呼び出しでは、共有ポインターに calloc の結果を次のようにフィードします。
std::shared_ptr<Entry *> binsPtr(new_bins, freePtr());
これが正しいかどうかはわかりません。
mmseg は、malloc() でプール割り当てルーチンを使用します。これは次のようになります。
inline void *pool_alloc(int len) {
void *mem = _pool_base;
if (len <= _pool_size) {
_pool_size -= len;
_pool_base += len;
return mem;
}
_pool_base = static_cast<char *>(std::malloc(REALLOC_SIZE));
mem = _pool_base;
_pool_base += len;
_pool_size = REALLOC_SIZE - len;
return mem;
}
アロケータは次のように呼び出されます。
Entry *entry = bins[h];
...
entry = static_cast<Entry *>(pool_alloc(sizeof(Entry)));
entry->word = word;
entry->next = NULL;
bins[h] = entry;
共有ポインターで malloc() をラップし、カスタム デリーターを定義できるように、pool_alloc ルーチンを変更することは可能ですか (おそらく、完全な pool_alloc fct をスキップして単に shared_ptr を使用することもできます)。
std::shared_ptr<Entry> entry((Entry *)malloc(sizeof(Entry)), freePtr());
struct freePtr {
void operator()(void* x) {
free(x);
}
};
誰かがこれについて私を助けることができれば素晴らしいでしょう. 前もって感謝します!
アップデート:
私の問題のために単純なメモリ プール クラスをコーディングしたので、すべてのポインタは自動的に破棄されます。shared_ptr でラップされた calloc() は正常に動作しているようで、期待どおりに動作します。Valgrind は、メモリ リークやエラーを報告しなくなりました。