shared_from_this () экземпляра, который еще не принадлежит shared_ptr, всегда возвращает null? - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь создать функцию-член, которая возвращает, сохранена ли она в shared_ptr.

class X : public std::enable_shared_from_this {
    ...
    bool is_shared() const {
        return shared_from_this();
    }
};

...

(new X())->is_shared(); // -> false?

Это законно? В этом случае, shared_from_this () гарантированно возвращает ноль и не выбрасывает исключение?

1 Ответ

0 голосов
/ 02 мая 2018

shared_from_this можно использовать для получения shared_ptr от объекта, которым уже управляет shared_ptr.

Вызов shared_from_this для не общего объекта является неопределенным поведением в C ++ 11.

Однако в C ++ 17 shared_from_this сгенерирует bad_weak_ptr, и вы можете поймать это исключение:

#include <memory>
#include <iostream>

class X : public std::enable_shared_from_this<X> {
  public:
    bool is_shared() const {
        try {
            shared_from_this();
            return true;
        } catch (std::bad_weak_ptr&) {
            return false;
        }
    }
};

int main() {
    X x;
    std::cout << std::boolalpha << x.is_shared() << std::endl;
    auto y = std::make_shared<X>();
    std::cout << y->is_shared() << std::endl;
}

Выход:

false
true

Кроме того, вы можете использовать weak_from_this, чтобы получить доступ к weak_ptr expired методу:

bool is_shared() const {
    return !weak_from_this().expired();
}
...