2014-09-02 2 views
1

Может кто-нибудь объяснить, почему следующие сбои? Я использую enable_shared_from_this, чтобы bob не удалялся.enable_shared_from_this. Почему крушение?

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

"Перед вызовом' shared_from_this', должно быть по крайней мере один 'станд :: shared_ptr p', который владеет' * this'." - [источник] (http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/shared_from_this) – clcto

+0

@clcto, я думаю, что ваш комментарий заслуживает того, чтобы его отвели. –

ответ

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

+0

Или еще лучше: 'std :: shared_ptr bob = std :: make_shared (" Bob ");' –

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(); 
} 
Смежные вопросы