函数指针和lambdas的内存管理。

问题描述 投票:3回答:1

我对C++比较陌生,对内存管理有一些疑问。

我是一个C#开发者,内存管理比C++容易,因为有垃圾回收器,我不知道什么时候要手动释放内存。

比如说,我在开发C#的时候,我不知道什么时候需要手动释放内存。

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

第一个lambda表达式会发生什么? 是否还在内存中? 我必须在重新分配 "ptr "之前做一些事情?

如果有人能给我解释一下这个特殊的情况,以及C++和内存是如何工作的,我将感激不尽。

c++ memory-management lambda function-pointers
1个回答
2
投票

C++语言在处理没有捕获列表的lambda函数时,就好像它们是真正的函数,它的名字是由编译器生成的,与所有其他函数的名字不同。因此,当你写

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

这有点像写下面的内容。

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

void (*ptr)() = &_CompilerGeneratedFn137;

这里实际上没有分配任何内存(除了用于 ptr 变量本身),而指针只是指向程序代码段的某个地方。当你再将 ptr 指向一个不同的lambda,你并没有泄漏任何内存;你只是改变了匿名函数 ptr 变点在。

希望对大家有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.