2013-03-02 105 views
0

我有一些包含使用calloc和malloc进行内存分配的自制哈希表的代码。我想用自定义删除器的shared_ptr修改这些部分,以自动释放分配的内存。代码是mmseg中文分段器算法的一部分,它工作的很好,但是如此糟糕,因为它留下了内存泄漏。我正在考虑使用unordered_map或类似的方式重写该代码,但现在我想进行这些更改。由std :: shared_ptr包装的calloc/malloc

我阅读类似问题上的答案,例如shared_ptr with malloc and freeAccessing 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报告没有更多的内存泄漏和错误。

+0

'pool_alloc'应该只允许分配一次内存,否则你会在那里发生内存泄漏。或者,当然要跟踪所有完成的“malloc”调用。 – 2013-03-02 13:32:24

+0

@JoachimPileborg:''pool_alloc''被多次调用(代码的作者陈述了这一点),因为代码中某处的指针会被简单覆盖。我已经知道这个问题,并且也会改变这种情况。 – 2013-03-02 13:36:39

回答

0

OP写道:

我编写了一个简单的内存池类我的问题,因此,所有指针都会自动销毁。 shared_ptr中包装的calloc()似乎工作正常,并按预期工作。 Valgrind报告没有更多的内存泄漏和错误。

换句话说,更改代码修复了错误。 :)此时可以安全地删除此问题。

相关问题