2017-12-05 5 views
1

ich das Video von Symbio C++ Seminar mit Herb Sutter beobachten - (Thrill of a) Lebensdauer 2016.06.20, https://www.youtube.com/watch?v=7b75rcHg7z0&t=917sLebensdauer der Zeiger

Der folgende Code wurde aus dem 11 :: 24 Video geschrieben. Die Zeiger p1, p2 und p3 müssen ungültig werden, wenn das Oszilloskop ausgeht. Es muss einen Fehler geben, wenn versucht wird, die Zeiger zu dereferenzieren.

Ich benutze online https://wandbox.org/ Umgebung. Sowohl gcc als auch clang ergeben die folgenden Ergebnisse. Was falsch sein muss.

Kann jemand den gleichen Code auf Visual Stdio überprüfen.

Dank

#include <iostream> 
using namespace std; 
#include <vector> 
#include <memory> 
#include <cstdio> 
#include <cassert> 
#include <string> 
#include <iterator> 
#include <algorithm> 
#include <array> 

int* p1 = nullptr; int* p2 = nullptr; int* p3 = nullptr; 

int main() { 
    { 
     int i = 1; 
     struct MyStruct { char a; int i; char c;} s = {'a', 2, 'c'}; 
     array<int,7> arr = {0,1,2,3,4,5,6}; 
     p1 = &i; 
     p2 = &s.i; 
     p3 = & arr[2]; 
     *p1 =*p2= *p3 = 42; 
     cout << *p1 << *p2 << *p3 << endl; 
    } 
    *p1 = 1; // This must give error 
    *p2 = 2; 
    *p3 = 3; 
    cout << *p1 << *p2 << *p3 << endl; 
} 

Dies ist die Ausgabe:

424242 
123 
+1

Hm? p1, p2, p3 haben einen globalen Geltungsbereich, da sie außerhalb aller Funktionen liegen, nicht wahr? – Ctx

+2

'nullptr' ist nicht C. –

+1

Warum denken Sie, dass sie einen Fehler geben müssen? Ich weigere mich zu glauben, dass Herb Sutter so etwas behaupten würde. – molbdnilo

Antwort

8

Das Verhalten des Codes ist undefined.

Nach der ersten cout Anweisung sind die Zeiger dangling. Sie zeigten auf Variablen mit automatischer Speicherdauer und sind jetzt nicht mehr verfügbar.

Ein C++ - Compiler ist nicht erforderlich,, um eine Diagnose (ein Dangling Pointer kann nicht immer zur Kompilierungszeit identifiziert werden), obwohl einige Sie warnen, wenn Sie die entsprechenden Flags festgelegt haben. Sie können die Quelle des undefinierten Verhaltens zu

int main() 
{ 
    int* p; 
    { 
     int n; 
     p = &n; 
    } 
    *p = 0; // oops 
} 
+0

Nein, der Compiler warnt nicht. Ich habe gefragt, ob jemand diesen Code auf Visual Studio testen kann. –

+2

@SabetayToros: Ich habe es getestet und der Compiler hat meine Katze gegessen. – Bathsheba

0

Visual C++ 17 abgeholzt versagt auch das undefinierte Verhalten zu erkennen, und gibt die gleiche Leistung.

+0

Das ist eher ein Kommentar, oder? Ich nehme an, Sie haben Ihren Text in die falsche Textbox eingegeben ;-) –

+1

@Michael Walz - Die Frage war: "Kann jemand den gleichen Code auf Visual Studio überprüfen?" Ich denke technisch ist die richtige Antwort: "Ja." –

+0

Ja, genau genommen beantwortet es die eigentliche Frage, aber es geht nirgendwohin zur Lösung der zugrunde liegenden Verwirrung von OP. (Im Grunde stellte OP die falsche Frage.) –