SIGSEV nach new[ca. 8000]



  • Hi,

    Ich schreibe gerade spaßeshalber an einem kleinen Programm, dass daten
    aus einem .pak file ausliest.
    Während ich die Daten aus der Datei auslese,
    muss ich Platz schaffen, um sie in den Speicher zu bekommen, was logischerweise
    per new erfolgt. Doch bei dem 6. Eintrag verabschiedet sich mein Programm mit
    dem allseits beliebten Segmentation fault.

    Der relevante Code:

    class PakFile {
        string filename;
    
        //Header of a packfile
        struct PakHeader {
            char signature[SIGNATURE_LEN];
            int32_t dir_offset;
            int32_t dir_size;
        };
    
        //An directory entry
        struct PakEntry {
            char name[FILENAME_LEN];
            int32_t position;
            int32_t length;
        };
    
        vector<PakEntry> entries;
        vector<char *> data;
    
        void open(const char *filename);
    
    public:
        ...de/constructor
    };
    
    void PakFile::open(const char *filename) {
    
        ...ein paar checks, ob die Datei existiert und nicht korrupt ist
    
        //Get the directoryentryheaders
        PakEntry entry;
        ifs.seekg(header.dir_offset, ios_base::beg);
        for(int i = 0; i < n_entries; i++) {
            ifs.read((char *) &entry, sizeof(PakEntry));
            entries.push_back(entry);
        }
    
        //Get the actual data
        char *data_buf;
        for(unsigned int i = 0; i < entries.size(); i++) {
            data_buf = new char[entries[i].length];
            ifs.seekg(entries[i].position, ios_base::beg);
            ifs.read(data_buf, entries[i].position);
            data.push_back(data_buf);
        }
    }
    

    Und bei new char[entries[i].length] verabschiedet er sich mit i = 6 und
    entries[i].length = 7924

    Dank im Voraus



  • Hi nochmal,

    Für alle, die sich die Mühe gemacht haben, mein Post zu lesen, danke, habe den Fehler schon.
    ifs.read(data_buf, entries[i]->position);
    hätte ich
    ifs.read(data_buf, entries[i]->length);
    schreiben sollen. 😞

    Naja, danke trotzdem allen


Anmelden zum Antworten