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" 创建了一个立即超出范围的临时字符串
我是 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" 创建了一个立即超出范围的临时字符串