【问题标题】:Can you deallocate functions in C++?你可以在 C++ 中释放函数吗?
【发布时间】:2021-08-02 13:47:23
【问题描述】:

最近有人告诉我,函数不能被释放,但毕竟它们是需要一些内存的指令,对吧?就像构造函数和析构函数的工作方式一样。那么有没有办法释放函数呢?

【问题讨论】:

  • 常规函数不会在内存中动态分配,所以不能解除分配
  • 你不能用 C++ 编写自修改代码。
  • xy problem?为什么要释放函数?也许有一种方法可以以不同的方式解决您的实际问题。您可以设置可调用对象的动态容器。
  • 也许底层 (XY) 问题是“deallocate 在 C++ 中是什么意思?”
  • 加载和卸载作为共享库/DLL 构建的库会同时为库中的所有代码(函数)和数据(全局和静态变量)分配和释放内存。这不是标准的 C++ 功能,而是特定于操作系统且与语言无关的功能。

标签: c++ memory memory-management


【解决方案1】:

大量程序内存是“静态”分配的(可执行代码、全局变量、常量);即全部映射一次并在加载时从系统中声明。它们在整个程序生命周期内保持分配状态,您无能为力。

大堆空间和栈空间也是预分配的,但可以根据需要进行扩展。动态分配的变量和自动分配的变量确实是在程序分配期间按需创建和删除的,但这并不一定意味着“内存消耗”会减少,因为堆和堆栈空间始终存在。

请注意,构造函数和析构函数不分配任何内存,它们只是执行初始化和反初始化任务。分配/解除分配在函数进入/退出时、在堆栈上或在调用 new/delete 时、在堆上执行。


事实上,事情更复杂,因为进程的内存空间是虚拟化的,即映射到物理上可用的 RAM 和磁盘块,所有运行的进程共享。

【讨论】:

  • 还要检查 Doron 的回答。
【解决方案2】:

是的,有。如果您在 Dll (LoadLibrary) 或 .so (dlopen) 中加载函数。当您分别调用FreeLibrarydlclose 时,您将释放该函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多