2017-07-11 4 views
0

Ich versuche, einen Interpreter mit C++ zu vervollständigen. Die rohe Version funktioniert gut. Ich versuche, einen Speicherpool und GC hinzuzufügen. Die Speicherpoolklasse MemPool enthält einen Zeiger auf MemList, und MemList enthält Zeiger auf Freiliste und Busliste. Sie sind Zeiger auf MemBlock, MemBlock enthält einen void * Pointer für allocate block.unordered_map Segmentfehler

I überschreiben Operator neu und löschen für syntaxtree Knoten. Operator new wird nur für die ASTree-Basisklasse verwendet und malloc wird in anderen Fällen als Alternative verwendet. ASTree ist die Basisklasse für alle Syntaxbaumknoten.

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

Im Deklarationsknoten verwende ich unordered_map, um zugehörige Unterdeklarationen zu speichern.

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

Ich finde das Programm an verschiedenen Orten zu unterschiedlicher Zeit abstürzt. Ich finde den Fehler kann durch unordered_map

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

verursacht werden manchmal Xcode ortet der Fehler in __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; 
      } 
     } 
    } 

Manchmal wird Fehler

__builtin_operator_delete(__ptr); 
gelegen

Manchmal Xcode mir sagt, ich befreit nicht verwendet wird, kann (Zeiger oder Speicher? Kann nicht genau erinnern). Ich bin sicher, dass der Fehler zu dem Zeitpunkt auftritt, zu dem die unodered_map-Einfügung aufgerufen wird. Ich denke, wenn ich ein Element einfügen, werden neue und löschen aufgerufen. kann

brauchen Ihre Hilfe T-T, könnten Sie mir sagen, wo falsch ist und wie es zu ändern

Antwort

0

Es ist schwierig, ohne tatsächliche Debuggen diese Frage zu beantworten, aber ich würde denken, dass Sie einen Fehler in Ihrem Pool Allocator haben.

Anstelle einer Lösung, empfehle ich Ihnen ein Debugging-Tool wie valgrind laufen wie hier vorgeschlagen: What is the equivalent of Valgrind within the Xcode environment?

Else, wenn Sie Code Standalone auf Linux kompiliert, können Sie valgrind direkt verwenden.

Wenn Ihre Anwendung multi-threaded ist, stellen Sie sicher, dass der Pool-Zuordner sicher ist.

+0

danke, ich werde es versuchen –