2017-02-27 6 views
0

Ich bekomme diesen Fehler (Speicherort variiert zwischen Läufen): Freigeben von Arbeitsspeicher! Image_Processing (6282,0x100091000) malloc: * Fehler für Objekt 0x1212121212121212: pointer befreit wird nicht zugewiesen wurde * einen Haltepunkt in malloc_error_break gesetztC++ falsche Prüfsumme für das freigegebene Objekt

in diesem Punkt zu debuggen stürzt: // m_Data löschen;

class Uint8Image { 
public: 
    uint32_t m_w; 
    uint32_t m_h; 
    uint8_t *m_data; 


    Uint8Image(uint32_t w, uint32_t h): m_w(w), m_h(h), m_data(0) 
    { 
     m_data = new uint8_t(w*h); 
    } 

    Uint8Image(const Uint8Image &obj) ; 

    Uint8Image& operator = (const Uint8Image &D) { 
     if(this != &D) 
     { 
      delete [] m_data; 
      m_w= D.m_w; 
      m_h = D.m_h; 
      m_data=new uint8_t(m_w * m_h); // deep copy the pointer data 
     } 
     return *this; 
    } 

~Uint8Image() 
    { 
     std::cout << "Freeing memory!"<< std::endl; 
    delete m_data; // it crashes here 
    m_data = NULL; 
    } 

}; 

class MeniscusFinderContext { 

public: 

    MeniscusFinderContext(uint32_t m_a, uint32_t m_b): 

    { 
     m_input_image = new Uint8Image(m_a,m_b); 

    } 

    ~MeniscusFinderContext() 
    { 
     delete m_input_image; 
     m_input_image = NULL; 

    } 

Uint8Image m_input_image;}; 

//The function that calls: 

// Unter Eingabe durch Option-Parsing,

int main(int argc, char *argv[]{ 
const char *file_name = options[INPUT].arg; 

    std::ifstream file_stream(file_name, 
           std::ifstream::in | std::ifstream::binary); 
    char buf[256]; 
    char *sEnd; 
    file_stream.getline(buf, sizeof(buf)); 
    if(buf[0] != 'P' || buf[1] != '5') { 
     std::cerr << "invalid input PGM file" << std::endl; 
     return 1; 
    } 
    file_stream.getline(buf, sizeof(buf)); 
    while(buf[0] == '#') file_stream.getline(buf, sizeof(buf)); 
    uint32_t m_a = strtol(buf, &sEnd, 10); 
    uint32_t m_b = strtol(sEnd, &sEnd, 10); 

    MeniscusFinderContext M(m_a,m_b); 


    file_stream.getline(buf, sizeof(buf)); 
    while(buf[0] == '#') file_stream.getline(buf, sizeof(buf)); 
    if(atoi(buf) != 255) return 3; 
    file_stream.read((char *)M.m_input_image->m_data ,m_a * m_b); 
    if(!file_stream) { 
     std::cerr << "only got " << file_stream.gcount() << std::endl; 
     return 2; 
    } 
    file_stream.close(); 
return 0; 
} 

Edit: Ich bin es läuft und manchmal läuft es, während andere es mir den Fehler gibt. Scheint zufällig zu sein. Alle Hinweise wären sehr hilfreich. Ich habe bereits alle zugehörigen Antworten im Stack-Überlauf überprüft, konnte es aber nicht herausfinden.

+0

Bitte versuchen Sie Ihren Post und Ihren Code neu zu formatieren, es ist wirklich schwer zu lesen. Um Code in Visual Studio neu zu formatieren, können Sie alle auswählen (Strg + A) und dann STRG + K + F drücken. – user2176127

+0

user2176127 ist es jetzt in Ordnung? –

+0

'm_data = neu uint8_t (m_w * m_h); // tiefe Kopie der Zeigerdaten 'kopiert nichts. –

Antwort

0
new uint8_t(w*h); 

Dies ordnet genau ein uint8_t, deren Anfangswert w*h.

Sie wahrscheinlich gedacht:

new uint8_t[w*h]; 

Andernfalls folgt aus:

file_stream.read((char *)M.m_input_image->m_data ,m_a * m_b); 

wird sofort diesen Pufferüberlauf. Derselbe Fehler tritt mehrmals im angezeigten Code auf.

delete m_data; 

Stuff zugeordnet mit new[] sollte mit delete[] werden ausgeplant.

Im Allgemeinen ist Ihr Gesamtansatz sehr fehleranfällig. Anstatt den Speicher manuell zu behandeln, sollten Sie auf diese Weise std::vector und Iteratoren verwenden. Die korrekte Verwendung von C++ - Containern reduziert die Möglichkeit, solche Fehler zu machen, erheblich.

+0

Aber ich bekomme immer noch diesen Fehler: Image_Processing (6371,0x100091000) malloc: *** Fehler für Objekt 0x100600268: Zeiger freigegeben wurde nicht zugeordnet *** Legen Sie einen Haltepunkt in malloc_error_break zu debuggen –

Verwandte Themen