有人可以解释为什么以下崩溃了吗?我正在使用enable_shared_from_this,以便不会删除bob。
class Person : public std::enable_shared_from_this<Person> {
private:
std::string name;
public:
Person (const std::string& name) : name(name) {}
std::string getName() const {return name;}
void introduce() const;
};
void displayName (std::shared_ptr<const Person> person) {
std::cout << "Name is " << person->getName() << "." << std::endl;
}
void Person::introduce() const {
displayName (this->shared_from_this());
}
int main() {
Person* bob = new Person ("Bob");
bob->introduce(); // Crash here. Why?
}
答案 0 :(得分:5)
shared_from_this
的一个先决条件是对象(this
)必须已由某些shared_ptr
拥有。然后,它返回一个shared_ptr
,与现有的shared_ptr
共享所有权。
因为在调用shared_ptr
时,您的对象不归任何shared_from_this
所有,所以您正在调用未定义的行为(它崩溃)。
请改为尝试:
int main() {
auto bob = std::make_shared<Person>("Bob");
bob->introduce();
}
答案 1 :(得分:3)
在致电
shared_from_this
之前,应该至少有一个std::shared_ptr<T> p
拥有*this
。
因此,如果我们将main()
更改为:
std::shared_ptr<Person> bob( new Person ("Bob") );
bob->introduce();
没有问题,因为已经有shared_ptr
拥有*this