2017-03-09 4 views
-2

Segmentation Fehler Erwartung aber doppelt frei oder Korruption (fasttop) bekommen: 0x0000000000cf4c20 ***Doppel frei Fehler statt Segmentation Fehler

PFB Code

#include<iostream> 
using namespace std; 

class test 
{ 
public: 
    int size; 
    int *elem; 
    test(int x):size(x),elem(new int[x]) 
    { 
     cout<<"default constructor"<<endl; 
    } 
    test(const test & x) 
    { 
     cout<<"copy constructor and shallow copying"; 
     this->size=x.size; 
     this->elem=x.elem; 
    } 
    ~test() 
    { 
     delete [] elem; 
    } 
    void display() 
    { 
     for (int i=0;i<size;i++) 
     { 
     cout<<*(elem+i)<<endl; 

     } 
    } 
}; 

int main() 
{ 
    test t(3); 
    t.elem[0]=12; 
    t.elem[1]=24; 
    t.elem[2]=33; 
    { 
     test f(t); 
     f.display(); 
     t.display(); 
    }  
    t.display(); 
} 

Ich versuche, flach Kopieren zu verstehen, und war Segmentierungsfehler erwartet.

+0

In Ihrem Kopierkonstruktor ordnen Sie elem vom Quellobjekt dem Zielobjekt zu. Wenn der Gültigkeitsbereich von test f() endet, ruft er das delete [] auf seinem Element auf, das auf das Element von t zeigt. Wenn main den Geltungsbereich verlässt, ruft t delete [] auf elem auf, aber dies wurde bereits freigegeben, wenn f den Gültigkeitsbereich verlassen hat. – user3336523

+0

Es sollte den Fehler vor dem Löschen des Speichers geworfen haben, wenn t Anrufe am Ende zeigt – unixlover

+0

Das ist nicht garantiert wie in der Antwort unten erwähnt. Obwohl Sie den Speicher löschen, ändern Sie den Elem-Zeiger in t nicht, um NULL zu sein, der immer noch auf die gleiche Stelle im Heap zeigt, und obwohl dieser Speicher nicht mehr zugeordnet ist, können Sie immer noch darauf zugreifen. – user3336523

Antwort

5

etwas Pass aber einen gültigen Zeiger auf reservierten Speicher oder eine nullptr-delete (oder delete[]) führt zu undefinierten Verhalten.

Auch da Sie den Zeiger im t Objekt verwenden, nachdem es zu delete[] bei der Zerstörung von f geben wurde haben Sie undefinierten Verhalten schon da in Ihrem letzten display Anruf.

Was passiert, wenn Sie UB (Undefined Behavior) haben, das ist wirklich irrelevant. Manchmal kann es scheint funktionieren gut (wie in Ihrem Anruf an display nach dem Speicher wurden gelöscht), manchmal erhalten Sie eine Segmentierung Fehler, manchmal erhalten Sie andere Fehler (wie die Doppel-frei), manchmal erhalten Sie nasal demons. Undefiniertes Verhalten ist per definitionem undefined.

+4

Wenn ich von einem System komme, das keinen Speicherschutz hat, schreckt es mich auf, wenn Leute einen Segfault "erwarten" ... – DevSolar

Verwandte Themen