Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
maxm
61 / 33 / 8
Регистрация: 17.07.2014
Сообщений: 441
#1

Lambda crash - C++

25.10.2016, 12:50. Просмотров 235. Ответов 10
Метки нет (Все метки)

Есть класс в продакшне. В одном из методов (они все static) обьявляю лямбду, в ней вызываю перегруженный метод из того же класса. Но она его не видит. Я сделал поинтер в методе и передал в capture лист - и она сьела! Но второй метод, который не имеет перегрузок, не выдал ошибки, все заработало. Только вот креш при его вызове. Почему так может быть?

Вот рабочий example код, как все выглядело. Есть идеи, почему такое может не работать? Даже если явно указать имя пространства класса, из которого я вызываю метод в лямбде. Сорс код продакшна не могу привести, слишком много. Да и ошибки явной нету, заметили бы.


C++
1
2
3
4
5
6
7
//MyClass.hpp
class MyClass
{
    void foo(int a, int b);
    void foo(const char* ch);
    void bar(int a);
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//MyClass.cpp
#include "myclass.hpp"
 
void MyClass::foo(int a, int b)
{
 
}
 
void MyClass::foo(const char* ch)
{
 
}
 
void MyClass::bar(int a)
{
 
}
 
void MyClass::test()
{
        // не компилит, если не передать поинтер на метод
    auto lambda = []()
    {
        bar(0); // результат тот же
        foo(1,2); // что так 
        MyClass::foo("Wow"); // что так
    };
 
        void(*pointer)(int a, int b); // так ОК
    auto lambda2 = [pointer]()
    {
        pointer(1, 2);
    };
 
    lambda();
}
C++
1
2
3
4
5
6
7
8
9
// main.cpp
#include "myclass.hpp"
#include <Windows.h>
 
int main()
{
    MyClass::test();
    system("pause");
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2016, 12:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Lambda crash (C++):

Rvalue reference and lambda - C++
void foo(A&amp;&amp; a) { auto l = () {}; //a? } Как передать в лямбду rvalue ref как просто ссылку? Чтобы потом использовать...

Variadic template lambda capture - C++
Доброго всем дня! Речь пойдёт об C++14, в котором стало возможным делать прямую передачу в замыкание: auto my_lambda = () { /*...

_beginrhread = crash 0xc0000417 - C++
code 417 значит неверный параметр был дан ф-ции рунтайма, а именно _beginthread _beginthread(func,0,NULL); но этот же код хорошо...

Crash в задаче с тимуса - C++
Вот вроде бы сам решил задачу с тимуса, но почему-то выдает ошибку &quot; Crash (access violation)&quot;. Помогите плз сделать код=) — Ох...

Crash (access violation) - C++
Задача: http://acm.timus.ru/problem.aspx?space=1&amp;num=1313 p.s. ссылку лучше откопипастить в браузер, т.к. форум на выходе её портит ...

Lambda Capture — extending object's lifetime - C++
Всем привет! // --- Поясняющий псевдокод. void SomeClass::func(Movable m) { Attribute&amp; attr = m.getAttribute(); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
VAN0
58 / 58 / 33
Регистрация: 05.05.2013
Сообщений: 150
Завершенные тесты: 1
25.10.2016, 12:59 #2
а где объявление метода test в классе MyClass?
0
Max Dark
шКодер самоучка
1825 / 1627 / 592
Регистрация: 09.10.2013
Сообщений: 3,634
Записей в блоге: 6
Завершенные тесты: 2
25.10.2016, 13:01 #3
maxm, для вызова нестатических методов нужен объект
0
maxm
61 / 33 / 8
Регистрация: 17.07.2014
Сообщений: 441
25.10.2016, 13:04  [ТС] #4
Извиняюсь, они статические. Провтыкал дописать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class MyClass
{
public:
    static void foo(int a, int b);
    static void foo(const char* ch);
    static void bar(int a);
    static void test();
};
 
void MyClass::foo(int a, int b)
{
 
}
 
void MyClass::foo(const char* ch)
{
 
}
 
void MyClass::bar(int a)
{
 
}
 
void MyClass::test()
{
    auto lambda = []()
    {
        bar(0);
        foo(1,2);
        foo("Wow");
    };
 
    void(*pointer)(int a, int b);
    auto lambda2 = [pointer]()
    {
        pointer(1, 2);
    };
 
    lambda();
}
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
25.10.2016, 13:08 #5
Цитата Сообщение от maxm Посмотреть сообщение
В одном из методов (они все static) обьявляю лямбду, в ней вызываю перегруженный метод из того же класса.
Он тоже static?
Если все функции static, то код работает. Пример: http://rextester.com/RWIC7797
0
maxm
61 / 33 / 8
Регистрация: 17.07.2014
Сообщений: 441
25.10.2016, 13:09  [ТС] #6
Да, это работает. В продакшне почти та же конструкция не работает. Поэтому и спрашиваю, сталкивался ли кто с подобным.
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
25.10.2016, 13:13 #7
Цитата Сообщение от maxm Посмотреть сообщение
В продакшне почти та же конструкция не работает. Поэтому и спрашиваю, сталкивался ли кто с подобным.
Надо смотреть что в продакшене.
Там у тебя вполне могут быть объективные причины, которых в твоем примере не видно.
* Чудес не бывает - ты делаешь что-то не так, подругому, нежели показал здесь.
* Что именно не так скажет только код.
0
alex white
38 / 22 / 2
Регистрация: 27.06.2016
Сообщений: 51
Завершенные тесты: 1
25.10.2016, 13:20 #8
maxm, а где инициализация указателя pointer?
0
maxm
61 / 33 / 8
Регистрация: 17.07.2014
Сообщений: 441
25.10.2016, 13:27  [ТС] #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
IUIAutomationElement* CCommon::FindControlFromArray(TCHAR *result, IUIAutomationElementArray* arrControls, BSTR controlName, BSTR controlLocalizedType)
{
//...
}
//...
IUIAutomationElementArray* CCommon::RecognizeCurrentUserDesktopWindowEx(wchar_t *result, const wstring& dialog) // new version
{   
auto isUIControlBasePresent = [&]() -> bool {
        auto UIControlBaseIt = find_if(UIControlBase.begin(), UIControlBase.end(), [&](Filter& filter) -> bool {
            return (*ptrFindControlFromArray)(&result[0], arrControls, filter.text, filter.type); // без указателя не катит
        });
        if (UIControlBaseIt != UIControlBase.end())
        {
            wsprintf(result, UIControlBaseIt->strToReturn);
            return true;
        }
        return false;
    };
}
Добавлено через 6 минут
Ошибка найдена. MSVS 2010 не билдит, 2015 - билдит. Компилятор немного старый.
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
25.10.2016, 13:43 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
maxm, вот воспроизвел твой код на тестовом примере в компиляторе из VS 2015: http://rextester.com/EZW85921
Как видно, проблем нет.
Если ошибка все-таки здесь и никакого побочного кода, способного повлиять на это, ты не утаил, то
* Предоставляешь версию своей студии (со всеми патчами и обновлениями);
* Предоставляешь полный текст ошибки компиляции.

Есть небольшая вероятность, что это баг в реализации стандарта С++11 в твоем компиляторе.

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от maxm Посмотреть сообщение
Ошибка найдена.
Прекрасно. Теперь, если тебя не затруднит, в будущем (в любой ситуации) при описании проблемы всегда прикладывай версию компилятора, и описание окружения (операционная система, разрядность), в котором собирается проблемный код. Это здорово ускорит дело и будет являться профессиональной вежливостью по отношению к тем, кто соберется помогать.

2
maxm
61 / 33 / 8
Регистрация: 17.07.2014
Сообщений: 441
25.10.2016, 13:57  [ТС] #11
Тестовый example компилирует на УРА и тот, и другой. Но вместе со всеми исходниками что то мешает в MSVS 10. Я уже сталкивался с таким, когда variadic templates писал.

Даже статью запилил, но прикрутить к MSVC 10 не вышло, хотя просто example из статьи собирает на ура.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2016, 13:57
Привет! Вот еще темы с ответами:

Lambda init capture by const reference - C++
Всем привет. Почему не получается добиться следующего поведения: auto main() -&gt; int { int ival = 0; () { // Need...

C++0x lambda (функция qSort не ест компаратор) - C++
Здравствуйте, у меня проблема: функция qSort не ест компаратор, если он объявлен как лямбда. Как это исправить? вот код: ...

Crash из-за static-членов классов - C++
Программа зависает или крашится из-за статических членов классов. Я пробовал убирать их - неприятностьт пропадает. Также зависание...

Анонимный объект по аналогии с анонимной функцией (lambda) - C++
Приведу вот такой пример: #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; class Generator { public: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.10.2016, 13:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru