Vector & System.AccessViolationException



  • Hi!

    Wenn ich in meinem Programm auf eine Klassenvariable zugreife, die vom Typ Vector<MeineEigeneKlasse> ist, dann erhalte ich einen System.AccessViolationException - Fehler.

    Das sagt mir so rein garnichts.
    Kann mir da wer helfen?
    Welche Infos braucht ihr?

    Hier meine Klasse, bei der der Fehler auf tritt:

    #pragma once
    #include "LexiconEntry.h"
    #include <string>
    #include <iostream>
    #include <vector>
    #include <fstream>
    using namespace std;
    
    const bool DEBUG = true;
    
    class Lexicon
    {
    	/////////////////////////////////////////////////////
    	// Private Attribute.
    	/////////////////////////////////////////////////////
    private:
    	vector<LexiconEntry> dictionary_entries;
    
    	/////////////////////////////////////////////////////
    	// Konstruktor.
    	/////////////////////////////////////////////////////
    public:
    	Lexicon() {
    	}
    
    	/////////////////////////////////////////////////////
    	// Private Methoden.
    	/////////////////////////////////////////////////////
    private:
    	void split(string& text, string& separators, vector<string>& words);
    
    public: // FIXME: nur zum Testen...
    	void split_lex_line(string& line, string &word, string& pos, vector<Attribute>& attributes);
    
    	/////////////////////////////////////////////////////
    	// Öffentliche Methoden.
    	/////////////////////////////////////////////////////
    public:
    	void fill_from_file(const string filename);
    	void fill();
    	void peter();
    	bool lookup(const string word, LexiconEntry &lex_entry);
    
    };
    

    Die Klassenvariable wird befült und ich kann in der Methode, die die Klassenvariable befüllt auch meine Debug-Funktktion (peter()) aufrufen und mir die Inhalte des Vektors anzeigen lassen.

    Wenn ich aber später darauf zugreife, nämlich in der Methode lookup:

    bool Lexicon::lookup(const string word, LexiconEntry &lex_entry) {
    	if(DEBUG) cout << "Lexicon.lookup()\n";
    
    	cout << "Größe des Lexikons: " << this->dictionary_entries.size() << " Einträge\n";
    
    	for( unsigned int i = 0; i < this->dictionary_entries.size(); i++ ) {
    		cout << "Lexicon.lookup() in for mit i=" << i << "\n";
    		/*
    		if( this->dictionary_entries.at(i).word() == word ) {
    			cout << "Lexikon.lookup(): Wort " << word << "wurde gefunden\n";
    			lex_entry.copy(this->dictionary_entries.at(i));
    			return true;
    		}
    		*/
    	}
    
    	// Nix gefunden, wenn hier angekommen.
    	return false;
    }
    

    Dann tritt an der Stelle wo ich vec.size() aufrufe der o.g. Fehler:

    Eine nicht behandelte Ausnahme des Typs "System.AccessViolationException" ist in Chartparser.exe aufgetreten.

    Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

    Das ist olle, besonders da ich mit der Fehlermeldung trotz googlen nichts anfangen kann.

    Greife ich eventuell einfach falsch auf die Variable zu?

    Grüße, pktm



  • meinst du diese stelle?

    pktm schrieb:

    cout << "Größe des Lexikons: " << this->dictionary_entries.size() << " Einträge\n";
    

    wenn ja, dann zeigt womöglich this auf kein Lexicon objekt (mehr).
    hast du das Lexicon objekt womöglich dynamisch angefordert, es irgendwo gelöscht und versuchst dann, weiter darauf zuzugreifen?



  • queer_boy schrieb:

    meinst du diese stelle?

    pktm schrieb:

    cout << "Größe des Lexikons: " << this->dictionary_entries.size() << " Einträge\n";
    

    wenn ja, dann zeigt womöglich this auf kein Lexicon objekt (mehr).
    hast du das Lexicon objekt womöglich dynamisch angefordert, es irgendwo gelöscht und versuchst dann, weiter darauf zuzugreifen?

    Jepp, ich meine genau diese Stelle. der Tect "Größe des L..." wird sogar noch angezeigt, danach der Fehler.

    So wirklich erstellt habe ich das Objekt nicht...
    this->dictionary_entries zeigt auf eine Klassenvariable:

    vector<LexiconEntry> dictionary_entries;
    

    Diese wird mit einer Methode zu Testzwecken befüllt:

    /**
     * Befüllt das Lexikon mit ein paar Testwörtern.
     */
    void Lexicon::fill() {
    	vector<Attribute> empty_attr;
    	this->dictionary_entries.push_back(LexiconEntry("der", "DET", empty_attr));
    	this->dictionary_entries.push_back(LexiconEntry("Hund", "NN", empty_attr));
    	this->dictionary_entries.push_back(LexiconEntry("bellt", "VVFIN", empty_attr));
    }
    

    Der Zugriff erfokgt danach, in dem Part wo das Lexikon gefüllt wird nochmal zur Ausgabe:

    /**
     * Lädt das angegebene Lexikon.
     * TODO: Prüfen, ob die Datei auch vorhanden ist.
     * TODO: Lexikon aus Datei befüllen.
     */
    void Chartparser::load_lex() {
    	this->lexicon = new Lexicon();
    	this->lexicon->fill();
    	this->lexicon->peter(); // FIXME: nur zu Testzwecken. Später entfernen.
    }
    

    peter() gibt nämlich ein paar Infos aus:

    /**
     * Peters some debug information to STDOUT.
     */
    void Lexicon::peter() {
    	if( this->dictionary_entries.empty() ) {
    		cout << "Keine Einträge im Lexikon\n";
    		return;
    	}
    
    	cout << "Lexinkon-Einträge:\n";
    	cout << "Wort\t:\tPOS\n";
    	for( unsigned int i = 0; i < this->dictionary_entries.size(); i++ ) {
    		cout << this->dictionary_entries.at(i).word() << "\t:\t" << this->dictionary_entries.at(i).pos() << "\n";
    	}
    	cout << "\n";
    }
    

    Grüße, pktm



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • test



  • @evilissimo:
    Hä? Wo siehst Du da C++/CLI?

    @MODS:
    C++

    @pktm:
    Wo und wie wird denn lookup aufgerufen? Zeig evtl. auch mal noch die Definition von Chartparser.


Log in to reply