给定一个指向某个变量的指针..有没有办法检查它是静态分配还是动态分配?
引用你的评论:
我正在制作一个基本上摆脱结构的方法。它有一个数据成员,它是一个指向可能会或可能不会被分配的东西的指针..根据哪一个,我想释放它
正确的方法是添加another结构体成员:指向释放函数的指针。
这不仅仅是静态分配与动态分配的问题。有several可能的分配器,其中malloc()
只是其中之一。
在类 Unix 系统上,它可能是:
- 静态变量
- 在堆栈上
- 在堆栈上但动态分配(即
alloca()
)
- 在堆上,分配有
malloc()
- 在堆上,分配有
new
- 在堆上,在分配有的数组的中间
new[]
- 在堆上,在分配有的结构内
malloc()
- 在堆上,在分配有的对象的基类内
new
- 分配有
mmap
- 使用自定义分配器分配
- 更多选项,包括上述选项的几种组合和变体
在 Windows 上,您还有多个运行时,LocalAlloc
, GlobalAlloc
, HeapAlloc
(有几个可以轻松创建的堆),等等。
您必须始终使用您使用的分配器的正确释放函数来释放内存。因此,要么程序中负责分配内存的部分也应该释放内存,要么您必须将正确的释放函数(或其包装器)传递给将释放内存的代码。
您还可以通过要求始终使用特定分配器分配指针或自己提供分配器(以分配内存的函数和可能释放内存的函数的形式)来避免整个问题。如果您自己提供分配器,您甚至可以使用技巧(如标记指针)来允许也使用静态分配(但我不会在这里详细介绍这种方法)。
陈雷蒙德有一篇关于它的博客文章(以 Windows 为中心,但概念在任何地方都是相同的):跨模块边界分配和释放内存
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)