170 похожих чатов

Привет, заметил тут разное поведение на двух компиляторах clang, mac

os и msvc windows в следующем коде.


почему так происходит? это уб?

#include <functional>

class a
{
public:
int a = 0, b = 0;
std::function<int()> l;

int f()
{
l = [this](){
a = 1;

l = [](){ return 1; }; // на винде this теряется и в следующей строчке происходит падение, на мак ос нет.

b = 1;
return 0;
};
return 0;
}
};

int main() {
a a_;
a_.f();
a_.l();
}

26 ответов

18 просмотров

предлагаю вопрос перенести в @procxx

Ilya Zviagin
Не, не надо переносить.

что не надо? может ты и ответ правильный знаешь?

Я думаю, это из-за отладочного режима в MSVC , она проверяет в функции this.

Ilya Zviagin
Так там его и нету.

"не зли меня, убью." (с) приключение итальянцев в россии

Поясни, где там что теряется? Какое поведение программы ты наблюдаешь?

Dmitry- Автор вопроса
Ilya Zviagin
Поясни, где там что теряется? Какое поведение прог...

смотрю в дебагере, this определяется как 0xadddddd и падает, после присвоения нового значения лямбде

Dmitry- Автор вопроса
Dmitry
смотрю в дебагере, this определяется как 0xadddddd...

при этом если в обнулении лямбды я захвачу this, то все пройдет штатно

Anatoly Shirokov
[this] же

Я про вторую говорил.

Ilya Zviagin
Я про вторую говорил.

пока идет исполнение первой ее контекст не должен измениться, то что ты присваиваешь l новую лямбду не означает, что контекст текущей должен измениться

Вижуалка какая? (компилятор)

Не пробовал переписать l = [](){ return 1; }; на l = []() -> int { return 1; };

example.cpp <source>(6): error C2461: 'a': constructor syntax missing formal parameters <source>(13): error C2513: 'a': no variable declared before '=' Compiler returned: 2

Pavel Perekhozhikh
example.cpp <source>(6): error C2461: 'a': constru...

Стандартик не забыл повыше поставить ?

Pavel Perekhozhikh
17 был

Ну так не может быть...

Pavel Perekhozhikh
https://godbolt.org/z/oa84vq

Там лучше внутреннюю переменную не A назвать, она совпадает с именем класса. Но это ничего не меняет.

Ilya Zviagin
Там лучше внутреннюю переменную не A назвать, она ...

Локально у меня все без крашей проходит, this не трется

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Карта сайта