enable_shared_from_this。撞车为什么?

时间:2014-09-02 17:05:44

标签: c++ shared-ptr

有人可以解释为什么以下崩溃了吗?我正在使用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?
}

2 个答案:

答案 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)

documentation州:

  

在致电shared_from_this之前,应该至少有一个std::shared_ptr<T> p拥有*this

因此,如果我们将main()更改为:

std::shared_ptr<Person> bob( new Person ("Bob") );
bob->introduce();

没有问题,因为已经有shared_ptr拥有*this