Как работает C ++ лямбда-оболочка вокруг функции-члена после деструктора? - PullRequest
0 голосов
/ 30 октября 2019

Следующий код работает и печатает Dead. Как вызов callback_fn не вызывает сбой, поскольку деструктор явно вызывается?

#include <iostream>
#include <memory>
#include <functional>

class A {
  private:
    std::string message = "Alive";
  public:
    ~A() { message = "Dead"; }
    auto get_callback() { return [this](){ callback(); }; }
  private:
    void callback() const { std::cout << message << std::endl; }
};

int main()
{   
    std::function<void()> callback_fn;
    {
        A a;
        callback_fn = a.get_callback();
    }
    callback_fn();
}

Так как this фиксируется значением:

  1. Как функционирует членвызывать работу после уничтожения объекта?
  2. Почему память message освобождается при a разрушении?

Если я напишу main, как это, я получаюнет вывода (что я подозреваю, что поведение не определено). Я ожидал бы того же поведения, что и код abve.

int main()
{
    auto a = std::make_unique<A>();
    auto callback_fn = a->get_callback();
    a.reset();
    callback_fn();
}

1 Ответ

3 голосов
/ 30 октября 2019

tl; dr - этот код делает то, что делает по чистой случайности

Вы вызываете неопределенное поведение здесь. Когда вы используете объект после его разрушения, может произойти все что угодно. (Un) К счастью для вас это работает и печатает вашу переменную. Но это может привести к краху программы или вызову демонов прямо из ада, поскольку это недопустимый код C ++.

...