2017-02-23 4 views
0

Я новичок в C++. Может кто-то пожалуйста, дайте мне знать, что это неправильно в следующем сегменте кода -C++ newbie: Операция 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")); 

Мое намерение состоит в том, чтобы создать базу данных объектов Person, и я пытался использовать shared_ptr для этого.

v-> dump() вызывает ошибку сегментации. Однако, если я использую «» NameStr переменную вместо строкового литерала «Тупая», то v-> появляется свалка(), чтобы работать правильно, то есть следующее -

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

Кроме того, следующий способ также, кажется, хотя я использую строковый литерал в intializer.

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

Указатели на ошибку Я делаю это очень ценно!

+0

Извините, что следует читать "PLIST. Я исправлю оригинальный пост. –

ответ

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; 
     } 

}; 

Это хранит ссылку на строку, срок службы которой не гарантируется. Вы должны сделать

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

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

}; 

Вы код не потому, что «Тупые» создал временную строку, которая вышла за рамки сразу

+0

Почему вы удалили 'const'? –

+0

Большое спасибо за ответ. Это имеет смысл. Мне было интересно, почему выглядит следующая форма: * work - std :: shared_ptr r1 (новое лицо («Dull»)); –

+0

, потому что вы еще не пытались получить доступ к чему-либо, что исчезло. Хотя эта строка выполняет 'std :: string (" Dull ")' существует, и вы можете создать ссылку на нее. После того, как строка выполняет «тусклый», исчезает, поэтому ref ('name') недействителен. Дела идут плохо, когда вы пытаетесь использовать эту ссылку – pm100

Смежные вопросы