2017-02-23 4 views
0

Ich bin neu in C++. Kann jemand lassen Sie mich bitte wissen, was mit dem folgenden Code-Segment falsch ist -C++ Neuling: Operation von make_shared

class Person { 
    public: 
     const std::string& name; 

     Person(const std::string& s): name(s) {} 
     void dump(void) const { 
     cout << name << endl; 
     //cout << &name << endl; 
     } 

}; 


std::map<std::string, std::shared_ptr<Person>> plist; 

std::string namestr = "Hoo"; 
std::shared_ptr<Person> r1(std::make_shared<Person>("Dull")); 
plist.insert({"Key1", r1}); 
auto u = plist.find("Key1"); 
shared_ptr<Person> v = u->second; 
v->dump(); 
plist.erase(plist.find("Key1")); 

Meine Absicht ist es, eine Datenbank von Person-Objekte zu erstellen, und ich versuchte, Shared_ptr dafür zu verwenden.

v-> dump() verursacht einen Segmentierungsfehler. Allerdings, wenn ich die ‚nameStr‘ Variable anstelle des Stringliteral „Dull“ verwenden dann die v-> dump() erscheint korrekt funktioniert, dh die folgenden -

std::shared_ptr<Person> r1(std::make_shared<Person>(namestr)); 

Auch auch die folgende Art und Weise scheint funktionieren, obwohl ich ein String-Literal im Intializer verwende.

std::shared_ptr<Person> r1(new Person("Dull")); 

Zeiger auf den Fehler, den ich mache würde sehr geschätzt werden!

+0

Sorry, dass lesen ‚plist‘ haben sollte. Ich korrigiere den ursprünglichen Beitrag. –

Antwort

1
class Person { 
    public: 
     const std::string& name; 

     Person(const std::string& s): name(s) {} 
     void dump(void) const { 
     cout << name << endl; 
     //cout << &name << endl; 
     } 

}; 

Hier wird ein Verweis auf eine Zeichenfolge gespeichert, deren Lebensdauer nicht garantiert ist. Sie sollten nicht

class Person { 
    public: 
     const std::string name; 

     Person(const std::string& s): name(s) {} 
     void dump(void) const { 
     cout << name << endl; 
     //cout << &name << endl; 
     } 

}; 

Sie Code tun, weil „Dull“ eine temporäre Zeichenfolge erstellt, die sofort den Gültigkeitsbereich ging

+0

Warum haben Sie die 'const' entfernt? –

+0

Vielen Dank für die Antwort. Das macht Sinn. Was ich gefragt habe, war warum das folgende Formular scheint * work - std :: shared_ptr r1 (neue Person ("Dull")); –

+0

weil Sie nicht versucht haben, auf etwas zuzugreifen, das noch nicht verschwunden ist. Während diese Zeile 'std :: string (" Dull ") ausführt' existiert und Sie können einen Verweis darauf erstellen. Nachdem die Zeile ausgeführt wurde, verschwindet "dull" und der Ref ('name') ist ungültig. Die Dinge gehen schlecht, wenn Sie versuchen, diese Referenz zu verwenden – pm100