У меня проблемы с пониманием, почему следующий код не дает сбоя.
class MyClass
{
public:
MyClass() { m_contents = 0xF0F0F0F0; }
void Hello() { printf("Hello, address: %llx, contents: %x, size: %d\n", (long long int)this, m_contents, sizeof(MyClass)); }
int m_contents;
};
int main()
{
MyClass* MyObj = new MyClass();
MyObj->Hello();
auto MyLambda = [MyObj]()
{
if (MyObj != nullptr)
{
MyObj->Hello();
}
};
memset(MyObj, 0, sizeof(MyClass));
MyObj->Hello();
delete MyObj;
MyObj = nullptr;
MyLambda();
return 0;
}
Это вывод:
Hello, address: 1ddb4a16100, contents: f0f0f0f0, size: 4
Hello, address: 1ddb4a16100, contents: 0, size: 4
Hello, address: 1ddb4a16100, contents: dddddddd, size: 4
Я бы ожидал сбоя лямбда-вызова, потому что я уничтожил всю память, используемую для вызова функции Hello (),Я знаю, что содержимое стирается, потому что m_contents становится 0. После вызова delete m_contents становится случайным значением, но все равно вызывается Hello (), и сбоя не происходит.
Последующий вопрос: В лямбде, где я передаю этот в качестве захвата, есть ли вероятность, что этот станет нулевым или недействительным к тому времени, когда лямбда будет вызвана