Fangen habe ich den folgenden Code, der 45
Ausgänge:einen Hängender Zeiger
#include <iostream>
int main()
{
int *p;
{
int n = 45;
p = &n;
}
std::cout << *p;
}
Da die Lebensdauer von n
am Umfang endet ich diesen Code erwartet einen Fehler oder eine Warnung auszusenden. Mit GCC 6.1.0 und Clang 3.8.0 und dem libubsan-Desinfektionsmittel erhalte ich keinen Blip.
g++ -Wall -Wextra -pedantic -fsanitize=undefined
clang++ -Weverything -fsanitize=undefined
Valgrind beklagen sich auch nicht. Wenn ich bei der Montage aussehen, wieder verwendet GCC nur den gleichen Wert aus dem Stapel:
400789: 48 89 45 f8 mov QWORD PTR [rbp-0x8],rax
std::cout << *p;
40078d: 48 8b 45 f8 mov rax,QWORD PTR [rbp-0x8]
400791: 8b 00 mov eax,DWORD PTR [rax]
400793: 89 c6 mov esi,eax
400795: bf 60 10 60 00 mov edi,0x601060
40079a: e8 81 fe ff ff call 400620 <std::basic_ostream<char, std::char_traits<char> >::operator<<(int)@plt>
}
std::cout << *p;
40079f: 48 8b 45 f8 mov rax,QWORD PTR [rbp-0x8]
4007a3: 8b 00 mov eax,DWORD PTR [rax]
4007a5: 89 c6 mov esi,eax
4007a7: bf 60 10 60 00 mov edi,0x601060
Ich weiß es nicht definiertes Verhalten ist ein NULL-Zeiger, aber was ist mit einem baumelnden Zeiger auf Ehrerbietung? (Wenn es nicht definiertes Verhalten ist, bitte Zitate aus dem Standard bieten.)
ich für jemanden beweisen möchte, es ist nicht definiertes Verhalten, nicht nur sagen, dass es ohne Beweis. Die duplicate hat viele Antworten, die nicht zitierte Behauptungen machen. In C heißt es explizit, dass "das Verwenden eines Objekts außerhalb seiner Lebensdauer" ein undefiniertes Verhalten ist. In C++ ist dies nicht der Fall. Tatsächlich scheint § 3.8 nichts direktes zu sagen.
Bitte öffnen Sie meine Frage erneut, damit ich einen tatsächlichen Beweis und keine Frachtkultur erhalten kann.
Schauen Sie sich das an. http://stackoverflow.com/questions/13888268/what-happens-when-a-variable-goes-out-of-scope Es ist fast genau die gleiche Frage. –
Die Lebensdauer von Funktionsebenenvariablen ist die Funktionsaufrufdauer. Die Sichtbarkeit ist auf den erklärenden Bereich beschränkt, die Lebensdauer ist jedoch nicht begrenzt. –
Fügen Sie Ihren Flaggen '-O' hinzu und Sie sollten eine Warnung erhalten. – user657267