Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ calloc/malloc由std::shared\u ptr包装_C++_Malloc_Smart Pointers_Calloc - Fatal编程技术网

C++ calloc/malloc由std::shared\u ptr包装

C++ calloc/malloc由std::shared\u ptr包装,c++,malloc,smart-pointers,calloc,C++,Malloc,Smart Pointers,Calloc,我有一些代码,其中包含一个使用calloc和malloc进行内存分配的自制哈希表。我想使用一个带有自定义删除器的共享ptr来修改这些部分,该删除器会自动释放分配的内存。 这段代码是mmseg中文分词器算法的一部分,它工作得很好,但由于内存泄漏而变得一团糟。我正在考虑使用无序的_映射等重写代码,但现在我想做这些更改 我阅读了类似问题的答案,例如or,但我在下面的代码中使用它时遇到了问题 我有这些线路,我不能用智能指针包装调用。也许有人能帮我解决这个问题: struct Word { uns

我有一些代码,其中包含一个使用calloc和malloc进行内存分配的自制哈希表。我想使用一个带有自定义删除器的共享ptr来修改这些部分,该删除器会自动释放分配的内存。 这段代码是mmseg中文分词器算法的一部分,它工作得很好,但由于内存泄漏而变得一团糟。我正在考虑使用无序的_映射等重写代码,但现在我想做这些更改

我阅读了类似问题的答案,例如or,但我在下面的代码中使用它时遇到了问题

我有这些线路,我不能用智能指针包装调用。也许有人能帮我解决这个问题:

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);
struct-Word{
无符号字符n字节;/*字节数*/
字符长度;/*字符数*/
无符号短频;
字符文本[word_embed_len];
};
结构条目{
单词*单词;
条目*下一步;
};
静态输入**新的存储箱=静态存储(std::calloc(初始大小,
规模(条目*);
条目*条目。。。;
...
新垃圾箱[哈希值]=条目;
....
免费(新垃圾箱);
在上面的calloc调用中,我将向共享指针提供calloc的结果,例如

std::shared_ptr<Entry *> binsPtr(new_bins, freePtr());
std::shared_ptr 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;
inline void*pool\u alloc(int len){
void*mem=_pool_base;
if(len-word=word;
entry->next=NULL;
箱子[h]=入口;
是否可以修改pool_alloc例程,比如我可以用一个共享指针包装malloc(),定义一个自定义的删除器(甚至可以跳过完整的pool_alloc fct,只使用一个共享的ptr),比如

std::shared_ptr<Entry> entry((Entry *)malloc(sizeof(Entry)), freePtr());

struct freePtr {
    void operator()(void* x) {
        free(x); 
    }
};
std::shared_ptr entry((entry*)malloc(sizeof(entry)),freePtr();
结构freePtr{
void运算符()(void*x){
免费(x);
}
};
如果有人能帮我,那就太好了。提前谢谢

更新:

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

OP写到:

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


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

应该只允许
pool\u alloc
分配内存一次,否则您将在那里发生内存泄漏。当然,也可以跟踪所有
malloc
调用的完成情况。@JoachimPileborg:
pool\u alloc
被多次调用(代码作者对此进行了说明)因为代码中某个点上的指针会被简单地覆盖。我已经知道这个问题,并将对此进行更改。