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

Lambda crash - C++

Восстановить пароль Регистрация
 
maxm
 Аватар для maxm
33 / 20 / 6
Регистрация: 17.07.2014
Сообщений: 351
25.10.2016, 12:50     Lambda crash #1
Есть класс в продакшне. В одном из методов (они все 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");
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2016, 12:50     Lambda crash
Посмотрите здесь:

C++ _beginrhread = crash 0xc0000417
C++ C++0x lambda (функция qSort не ест компаратор)
Crash в задаче с тимуса C++
C++ Crash (access violation)
Rvalue reference and lambda C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VAN0
48 / 48 / 27
Регистрация: 05.05.2013
Сообщений: 132
Завершенные тесты: 1
25.10.2016, 12:59     Lambda crash #2
а где объявление метода test в классе MyClass?
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
25.10.2016, 13:01     Lambda crash #3
maxm, для вызова нестатических методов нужен объект
maxm
 Аватар для maxm
33 / 20 / 6
Регистрация: 17.07.2014
Сообщений: 351
25.10.2016, 13:04  [ТС]     Lambda crash #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();
}
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
25.10.2016, 13:08     Lambda crash #5
Цитата Сообщение от maxm Посмотреть сообщение
В одном из методов (они все static) обьявляю лямбду, в ней вызываю перегруженный метод из того же класса.
Он тоже static?
Если все функции static, то код работает. Пример: http://rextester.com/RWIC7797
maxm
 Аватар для maxm
33 / 20 / 6
Регистрация: 17.07.2014
Сообщений: 351
25.10.2016, 13:09  [ТС]     Lambda crash #6
Да, это работает. В продакшне почти та же конструкция не работает. Поэтому и спрашиваю, сталкивался ли кто с подобным.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
25.10.2016, 13:13     Lambda crash #7
Цитата Сообщение от maxm Посмотреть сообщение
В продакшне почти та же конструкция не работает. Поэтому и спрашиваю, сталкивался ли кто с подобным.
Надо смотреть что в продакшене.
Там у тебя вполне могут быть объективные причины, которых в твоем примере не видно.
* Чудес не бывает - ты делаешь что-то не так, подругому, нежели показал здесь.
* Что именно не так скажет только код.
alex white
35 / 19 / 2
Регистрация: 27.06.2016
Сообщений: 39
Завершенные тесты: 1
25.10.2016, 13:20     Lambda crash #8
maxm, а где инициализация указателя pointer?
maxm
 Аватар для maxm
33 / 20 / 6
Регистрация: 17.07.2014
Сообщений: 351
25.10.2016, 13:27  [ТС]     Lambda crash #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 - билдит. Компилятор немного старый.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
25.10.2016, 13:43     Lambda crash #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
maxm, вот воспроизвел твой код на тестовом примере в компиляторе из VS 2015: http://rextester.com/EZW85921
Как видно, проблем нет.
Если ошибка все-таки здесь и никакого побочного кода, способного повлиять на это, ты не утаил, то
* Предоставляешь версию своей студии (со всеми патчами и обновлениями);
* Предоставляешь полный текст ошибки компиляции.

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

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2016, 13:57     Lambda crash
Еще ссылки по теме:

Lambda Capture — extending object's lifetime C++
Lambda init capture by const reference C++
Variadic template lambda capture C++

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

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

Даже статью запилил, но прикрутить к MSVC 10 не вышло, хотя просто example из статьи собирает на ура.
Yandex
Объявления
25.10.2016, 13:57     Lambda crash
Ответ Создать тему
Опции темы

Текущее время: 14:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru