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

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

Войти
Регистрация
Восстановить пароль
 
maxm
 Аватар для maxm
38 / 25 / 6
Регистрация: 17.07.2014
Сообщений: 378
#1

Lambda crash - C++

25.10.2016, 12:50. Просмотров 197. Ответов 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");
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VAN0
51 / 51 / 29
Регистрация: 05.05.2013
Сообщений: 137
Завершенные тесты: 1
25.10.2016, 12:59     Lambda crash #2
а где объявление метода test в классе MyClass?
Max Dark
В поиске работы
 Аватар для Max Dark
1548 / 1401 / 501
Регистрация: 09.10.2013
Сообщений: 3,184
Записей в блоге: 8
Завершенные тесты: 2
25.10.2016, 13:01     Lambda crash #3
maxm, для вызова нестатических методов нужен объект
maxm
 Аватар для maxm
38 / 25 / 6
Регистрация: 17.07.2014
Сообщений: 378
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
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
25.10.2016, 13:08     Lambda crash #5
Цитата Сообщение от maxm Посмотреть сообщение
В одном из методов (они все static) обьявляю лямбду, в ней вызываю перегруженный метод из того же класса.
Он тоже static?
Если все функции static, то код работает. Пример: http://rextester.com/RWIC7797
maxm
 Аватар для maxm
38 / 25 / 6
Регистрация: 17.07.2014
Сообщений: 378
25.10.2016, 13:09  [ТС]     Lambda crash #6
Да, это работает. В продакшне почти та же конструкция не работает. Поэтому и спрашиваю, сталкивался ли кто с подобным.
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
25.10.2016, 13:13     Lambda crash #7
Цитата Сообщение от maxm Посмотреть сообщение
В продакшне почти та же конструкция не работает. Поэтому и спрашиваю, сталкивался ли кто с подобным.
Надо смотреть что в продакшене.
Там у тебя вполне могут быть объективные причины, которых в твоем примере не видно.
* Чудес не бывает - ты делаешь что-то не так, подругому, нежели показал здесь.
* Что именно не так скажет только код.
alex white
37 / 21 / 2
Регистрация: 27.06.2016
Сообщений: 45
Завершенные тесты: 1
25.10.2016, 13:20     Lambda crash #8
maxm, а где инициализация указателя pointer?
maxm
 Аватар для maxm
38 / 25 / 6
Регистрация: 17.07.2014
Сообщений: 378
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
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
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
Еще ссылки по теме:

C++ Сохранение и чтение структуры из файла (crash программы)
Lambda Capture — extending object's lifetime C++
Lambda expressions only available with -std=c++11 or -std=gnu++11 C++
Lambda init capture by const reference C++
Variadic template lambda capture C++

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

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

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

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