windows - 调用_freea 真的有必要吗?

标签 windows stack memory-management

我正在使用 DevStudio 在 Windows 上进行非托管 C/C++ 开发。

我想在堆栈而不是堆上分配一些内存,因为我不想手动释放内存(我知道智能指针和所有这些东西。我有一个非常具体的内存案例我需要处理的分配),类似于 A2W() 和 W2A() 宏的使用。

_alloca 这样做,但已弃用。建议改用malloca。但是 _malloca 文档说每次调用 _malloca 时都必须调用 ___freea。这违背了我使用 _malloca 的目的,我将改用 malloc 或 new。

有人知道我是否可以在不泄漏的情况下不调用 _freea 以及内部影响是什么?

否则,我最终只会使用已弃用的 _alloca 函数。

最佳答案

在每次调用 _malloca 之后调用 _freea 总是很重要的。

_malloca 类似于 _alloca,但添加了一些额外的安全检查和增强功能来保护您。因此,_malloca 可以在堆上而不是堆栈上进行分配。如果发生这种情况,并且您不调用 _freea,就会发生内存泄漏。

在 Debug模式下,_malloca 总是在堆上分配,所以也应该被释放。

搜索 _ALLOCA_S_THRESHOLD 以了解有关阈值如何工作的详细信息,以及为什么存在 _malloca 而不是 _alloca,这应该是有意义的。


编辑:

有评论说人家只​​是在堆上分配,用智能指针等。

堆栈分配有很多优点,_malloca 将为您提供,因此有理由想要这样做。 _alloca 将以相同的方式工作,但更有可能导致堆栈溢出或其他问题,不幸的是,它不提供很好的异常,而往往只是破坏你的进程。 _malloca 在这方面要安全得多,并且可以保护您,但代价是您仍然需要使用 _freea 释放内存,因为 _malloca 有可能(但在 Release模式下不太可能)选择在堆上而不是堆栈上分配。

如果您的唯一目标是避免必须释放内存,我会建议使用一个智能指针,它会在成员超出范围时为您处理内存释放。这会在堆上分配内存,但为了安全起见,并且可以防止您释放内存。不过,这仅适用于 C++ - 如果您使用的是普通的 C,则此方法无效。

如果您出于其他原因尝试在堆栈上进行分配(通常是性能,因为堆栈分配非常非常快),我建议您使用 _malloca 并接受这样一个事实,即您需要根据您的值调用 _freea .

关于windows - 调用_freea 真的有必要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734854/

相关文章:

Windows 中的 Java 和符号链接(symbolic link)

windows - 在 Windows 上,如何验证安装的 CuDNN 的版本号?

c++ - 在 Linux 下如何为可执行文件分配堆栈?

c - x86 调用约定 : should arguments passed by stack be read-only?

memory - MEM_RESERVE 和 MEM_COMMIT 状态之间的确切区别是什么?

c - 简单数组初始化填充在 Linux (CentOS) 中有效,但在 Windows 中无效

c++ - 如果我有小型转储文件或异常结构,我如何获得 winqual 使用的 "bucket id"? (Windows C++)

c++ - 系统运行时是否有延迟计时器?

c - 调用结构成员时出现段错误

c++ - 我可以防止在重载删除之前调用析构函数吗?