0

Ich habe folgenden Codeundefined Verhalten zu rohen Zeiger von einem gelöschten shared_ptr zu verwenden?

#include <iostream> 
#include <memory> 
#include <cassert> 

int main() 
{ 
    void* p_any = nullptr; 

    { 
     auto p_src = std::make_shared<int>(10); // new instance   
     p_any = p_src.get();      // get raw unmanaged pointer? 
     auto p_again = reinterpret_cast<int*>(p_any); 
     assert(*p_src == *p_again); 
    } 

    auto p_again = reinterpret_cast<int*>(p_any); // ?? 
    std::cout << *p_again << "\n";    // undefined?, expected? 

} 

die letzten beiden Aussagen sicher sind?

Ich kann es http://cpp.sh/6poh mit output "10", ausführen, aber wird es erwartet? oder nur ein undefiniertes Verhalten?

+0

'assert (* p_src = * p_again);' - Sind Sie sicher, dass es nicht '==' hier sein sollte? – yeputons

+0

Fehler behoben, danke – elgcom

+1

Sie können Zeiger auf nicht vorhandene Objekte nicht de-Referenzieren, also nicht, nicht sicher. – juanchopanza

Antwort

4

Das Objekt p_src geht mit der schließenden Klammer über den Gültigkeitsbereich hinaus, und da keine andere gemeinsam genutzte Zeigerinstanz vorhanden ist, wird der enthaltene Zeiger gelöscht. So wird p_any auf gelöschte Daten zeigen und Sie werden tatsächlich undefined Verhalten haben.

+2

[Hier] (http://cpp.sh/4aui) ist der Beweis, dass es UB ist. –

Verwandte Themen