C++新手:make_shared的运算

C++ newbie: Operation of make_shared

我是 C++ 新手。有人可以让我知道以下代码段有什么问题吗 -

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' 变量而不是字符串文字 "Dull" 那么 v->dump() 似乎可以正常工作,即以下 -

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

此外,即使我在初始化器中使用字符串文字,以下方法似乎也有效。

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

如果能指出我所犯的错误,将不胜感激!

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

};

您的代码失败,因为 "Dull" 创建了一个立即超出范围的临时字符串