我有一些包含使用calloc和malloc進行內存分配的自制哈希表的代碼。我想用自定義刪除器的shared_ptr修改這些部分,以自動釋放分配的內存。代碼是mmseg中文分段器算法的一部分,它工作的很好,但是如此糟糕,因爲它留下了內存泄漏。我正在考慮使用unordered_map或類似的方式重寫該代碼,但現在我想進行這些更改。由std :: shared_ptr包裝的calloc/malloc
我閱讀類似問題上的答案,例如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;
是否有可能修改pool_alloc程序比如我可以用共享指針來包裝malloc(),定義一個自定義刪除器(甚至可以跳過完整的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報告沒有更多的內存泄漏和錯誤。
'pool_alloc'應該只允許分配一次內存,否則你會在那裏發生內存泄漏。或者,當然要跟蹤所有完成的「malloc」調用。 – 2013-03-02 13:32:24
@JoachimPileborg:''pool_alloc''被多次調用(代碼的作者陳述了這一點),因爲代碼中某處的指針會被簡單覆蓋。我已經知道這個問題,並且也會改變這種情況。 – 2013-03-02 13:36:39