Управление памятью указателей функций и лямбда-выражений - PullRequest
3 голосов
/ 30 мая 2020

Я относительно новичок в C ++, и у меня есть несколько вопросов об управлении памятью.

Я разработчик C#, и управление памятью проще, чем C ++, из-за сборщика мусора, а я не Не знаю, когда нужно освобождать память вручную.

Например:

void (*ptr)() = [] { /* 1rst lambda expression code*/ };
ptr = [] { /*2nd lambda expression code*/ };

Что случилось с первым лямбда-выражением ?, Остается ли оно в памяти? Я должен сделать что-то, прежде чем переназначить 'ptr'?.

Если кто-нибудь может объяснить мне этот конкретный случай и как работает C ++ и память, я был бы признателен!

1 Ответ

2 голосов
/ 30 мая 2020

Язык C ++ обрабатывает лямбда-функции без списков захвата, как если бы они были настоящими функциями с некоторым сгенерированным компилятором именем, которое отличается от имен всех других функций. В результате, когда вы пишете

void (*ptr)() = [] { /* 1rst lambda expression code*/ };

, это вроде как писать следующее:

static void _CompilerGeneratedFn137() {
    /* lambda code */
}

void (*ptr)() = &_CompilerGeneratedFn137;

Здесь фактически не выделяется память (кроме места для переменной ptr сам), а указатель просто указывает куда-то в сегмент кода программы. Когда вы затем переназначаете ptr для указания на другую лямбду, вы не теряете никакой памяти; вы просто меняете анонимную функцию, на которую указывает переменная ptr.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...