unordered_map段错误

时间:2017-07-11 03:57:58

标签: c++ segmentation-fault override unordered-map

我正在尝试使用c ++完成一个解释器。原始版本运行良好。我尝试添加内存池和gc。内存池类MemPool包含一个指向MemList的指针,MemList包含指向freelist和busylist的指针。它们是MemBlock的指针,MemBlock包含一个用于分配块的void *指针。

我重写operator new并删除syntaxtree节点。 operator new仅用于ASTree基类,malloc在其他情况下用作替代。 ASTree是所有语法树节点的基类。

void *ASTree::operator new(size_t size){
    cout<<"Using modified new operator!"<<endl;
    void *buff=MemPool::getInstance()->alloc(size);
    return buff;
}

void ASTree::operator delete(void *buff){
    if(!MemPool::getInstance()->dealloc(buff))
        throw MemoryError(curmodname,curline);
}

在声明节点中,我使用unordered_map来存储相关的子声明。

class DeclModule:public Declaration{
public:
    DeclModule(const string &modname);
//    ~DeclModule();
    int getDeclType();
    void intepret();
    string modname;

    unordered_map<string, DeclModule *> modulelist;
    unordered_map<string, DeclClass *> classlist;
    unordered_map<string, DeclMethod *> methodlist;
    DeclEntry *entry;
};

我发现程序在不同的时间在不同的地方崩溃。我发现错误可能是由unordered_map

引起的
DeclMethod *declmethod=methodParser();
declmodule->methodlist[declmethod->methodname]=declmethod;

有时xcode会在__nd = __bucket_list _ [__ chash]中找到错误;

template <class _Key, class _Args>
_LIBCPP_INLINE_VISIBILITY
pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_key_args(_Key const& __k, _Args& __args)
#endif
{

    size_t __hash = hash_function()(__k);
    size_type __bc = bucket_count();
    bool __inserted = false;
    __next_pointer __nd;
    size_t __chash;
    if (__bc != 0)
    {
        __chash = __constrain_hash(__hash, __bc);
        __nd = __bucket_list_[__chash];
        if (__nd != nullptr)
        {
            for (__nd = __nd->__next_; __nd != nullptr &&
                                       __constrain_hash(__nd->__hash(), __bc) == __chash;
                                                           __nd = __nd->__next_)
            {
                if (key_eq()(__nd->__upcast()->__value_, __k))
                    goto __done;
            }
        }
    }

有时会找到错误

__builtin_operator_delete(__ptr);

有时xcode告诉我我不能使用释放(指针或内存?记不清楚)。我确信在调用unodered_map insert时会发生错误。我想当我插入一个元素时,会调用new和delete。可能

需要你的帮助T-T,你能告诉我错误是什么以及如何修改

1 个答案:

答案 0 :(得分:0)

如果没有实际调试,很难回答这个问题,但我认为你的池分配器中有一个错误。

我建议您运行类似valgrind的调试工具,而不是解决方案,如下所示:What is the equivalent of Valgrind within the Xcode environment?

如果你在Linux上独立编译编译,你可以直接使用valgrind。

如果您的应用程序是多线程的,请确保您的池分配器是安全的。