【问题标题】:Memory management of function pointers and lambdas函数指针和 lambda 的内存管理
【发布时间】:2020-05-29 21:47:27
【问题描述】:

我是 C++ 的新手,我对内存管理有一些疑问。

我是一名 C# 开发人员,内存管理比 C++ 更容易,因为有垃圾收集器,我不知道什么时候必须手动释放内存。

例如:

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

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

如果有人可以向我解释这个特殊情况以及 C++ 和内存是如何工作的,我将不胜感激!

【问题讨论】:

  • 您需要自己释放内存的唯一一次是您自己动态分配内存,通过new 运算符、malloc()-like 函数、直接操作系统内存函数等(或者您正在为您进行此类分配的库调用)。必须使用相应的释放函数释放分配的内存。任何其他时间,内存管理都会自动为您处理。由于您的 lambda 不是动态分配的,因此您没有什么可以释放的。仅仅因为你有一个指向某物的指针并不总是意味着你必须释放指向的东西

标签: c++ memory-management lambda function-pointers


【解决方案1】:

C++ 语言处理没有捕获列表的 lambda 函数,就好像它们是真正的函数,具有一些编译器生成的名称,该名称不同于所有其他函数的名称。结果,当你写

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

这有点像写以下内容:

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

void (*ptr)() = &_CompilerGeneratedFn137;

这里实际上没有分配内存(ptr 变量本身的空间除外),并且指针只是指向程序代码段的某个位置。然后,当您重新分配 ptr 以指向不同的 lambda 时,您不会泄漏任何内存;您只是在更改 ptr 变量指向的匿名函数。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2015-05-19
    • 2013-12-23
    相关资源
    最近更新 更多