2017-07-11 2 views
0

J'essaie de compléter un interpréteur en utilisant C++. La version brute fonctionne bien. J'essaye d'ajouter un pool de mémoire et gc à lui. La classe de pool de mémoire MemPool contient un pointeur vers MemList et MemList contient des pointeurs vers la liste libre et l'arborescence. Ce sont des pointeurs vers MemBlock, MemBlock contient un pointeur void * pour allouer un bloc.unordered_map segment fault

Je remplace l'opérateur new et supprime pour le noeud syntaxtree. L'opérateur new n'est utilisé que pour la classe de base ASTree et malloc est utilisé comme alternative dans d'autres cas. ASTree est la classe de base pour tous les nœuds d'arbre de syntaxe.

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); 
} 

Dans le nœud de déclaration, j'utilise unordered_map pour stocker les sous-déclarations associées. Je trouve que le programme se bloque à différents endroits à différents moments de l'année. Je trouve l'erreur peut être causée par unordered_map

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

parfois Xcode localise l'erreur dans __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; 
      } 
     } 
    } 

Parfois, l'erreur se trouve

__builtin_operator_delete(__ptr); 

Parfois, Xcode me dit que je ne peux pas utilisé libéré (pointeur ou mémoire? Ne peut pas se souvenir clairement). Je suis sûr que l'erreur se produit au moment où l'insert unodered_map est appelé. Je suppose que lorsque j'insère un élément, new et delete sont appelés. peut

Besoin de votre aide T-T, pourriez-vous me dire où le mal est et comment le modifier

Répondre

0

Il est difficile de répondre à cette question sans débogage réelle, mais je pense que vous avez un bug dans votre allocateur piscine.

Au lieu d'une solution, je vous suggère d'exécuter un outil de débogage comme valgrind comme le suggère ici: What is the equivalent of Valgrind within the Xcode environment?

Sinon, si vous codez Compile autonome sous Linux, vous pouvez utiliser valgrind directement. Si votre application est multithread, assurez-vous que l'allocateur de pool est sécurisé.

+0

merci, je vais essayer –