2016-06-17 5 views
-2

Die Frage ist also, wie verhindert der ursprüngliche Entwickler eine Situation, in der Benutzer/neuer Entwickler versucht, auf ein freies 'd Speicherelement zuzugreifen.Wie verhindert man undefiniertes Verhalten aus Sicht eines Anwenders/eines neuen Entwicklers?

int *num=(int *)malloc(n*sizeof(int)); 
int i; 
for(i=0;i<n;i++) 
{ 
scanf("%d",&num[i]);   
}  

for(i=0;i<n-1;i++){ 
temp = some_function(x);   
} 

free(num); 

for(i=0;i<n;i++) 
{ 
    printf("\nnum[%d]= %d\n",i,num[i]);   
} 

S.S .: Der obige Code funktioniert und druckt tatsächlich Daten in Array. Was ist nicht unsere Absicht. [EDIT] Tut mir leid, wenn ich nicht klar genug war. Jemand hat vorgeschlagen, das als eine getrennte Frage zu stellen, ich dachte, warum nicht. Hier ist die original post

+1

_Der obige Code funktioniert und druckt tatsächlich Daten in array._ .. Willkommen bei UB. –

+1

[Bitte lesen Sie die Diskussion darüber, warum der Rückgabewert von 'malloc()' und Familie nicht in 'C' umgewandelt werden soll.] (Http://stackoverflow.com/q/605845/2173917). –

+0

Der Code funktioniert auf einer bestimmten Plattform, wahrscheinlich in einem Debug-Build. Das Ausführen eines anderen Systems (oder eines Releasebuilds) kann zum Absturz führen. Es hängt vom Speicherzuordner ab. Einige Zuweiser werden nach dem Freiwerden Null setzen (oder alle Bytes auf etwas anderes setzen), so dass Sie dann andere Ergebnisse erhalten würden. – Neil

Antwort

4

Die Tatsache, dass der Code „Werke“ ist eine Manifestation des undefinierten Verhalten, die Sie erleben sind, wenn Speicher zu lesen, dass Sie nicht mehr besitzen.

Sie könnte betrachten num-NULL nach dem ersten free Anruf. Dann wird das Schreiben von num[i] fast sicher das Programm zum Absturz bringen. Es kann auch gelegentlich nützlich sein: Ein free wird mit NULL aufgerufen, da der Zeiger ein No-Op ist.

Es gibt wenig, was Sie leider tun können.

Aber im Allgemeinen, Einstellung free d Zeiger auf NULL führt zu schlampigen Programmierung, so dass ich dazu tendiere, es zu vermeiden.

1

Als erstes können Sie num = NULL setzen.

Allgemein können Sie einen malloc-Hook hinzufügen, um Speicher in den Speicher zu schreiben, bevor Sie den Speicher freigeben (wahrscheinlich nur debuggen). Dies wird einen Absturz erzwingen, wenn der Speicher in diesem Fall Zeiger enthält oder Unsinn druckt, wenn auf freigegebenen Speicher zugegriffen wird.

Auch, da Sie C++ sprechen, verwenden Sie Smartpointer.

Edit: das Crash-Problem behoben.

+0

Wie wird das Programm durch Müllwerte abstürzen als Werte schon da? – 4386427

+0

@ 4386427 Es kann nicht das Programm abstürzen, aber es wird den Zugriff auf die Originaldaten verhindern, wodurch ein Bug leichter zu erkennen ist. –

+0

Sorry dachte über den allgemeineren Fall nach, wenn der Speicher Zeiger enthielt. – doron

Verwandte Themen