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
danke, ich werde es versuchen –