给定一个变量的指针..有没有办法检查它是静态还是动态分配?
引用您的评论:
我正在制作一个基本上摆脱结构的方法.它有一个数据成员,它指向可能或可能没有被malloced的东西..取决于哪一个,我想释放它
正确的方法是在结构中添加另一个成员:指向释放函数的指针.
它不仅仅是静态与动态分配.有几种可能的分配器,其中malloc()
只有一种.
在类Unix系统上,它可能是:
一个静态变量
在堆栈上
在堆栈上但动态分配(即alloca()
)
在堆上,分配 malloc()
在堆上,分配 new
在堆上,在分配的数组的中间 new[]
在堆上,在分配的结构中 malloc()
在堆上,在分配的对象的基类中 new
分配 mmap
分配自定义分配器
更多选项,包括上述的几种组合和变体
在Windows上,也有一些运行时,LocalAlloc
,GlobalAlloc
,HeapAlloc
(与几个堆,你可以轻松地创建),等等.
您必须始终使用您使用的分配器的正确释放功能释放内存.因此,负责分配内存的程序部分也应释放内存,或者必须将正确的释放函数(或其周围的包装器)传递给释放内存的代码.
您还可以通过要求指针始终使用特定分配器进行分配,或者通过自己提供分配器(以函数的形式分配内存以及可能的函数来释放它)来避免整个问题.如果你自己提供分配器,你甚至可以使用技巧(如标记指针)来允许一个人也使用静态分配(但我不会在这里详细介绍这种方法).
Raymond Chen有一篇关于它的博客文章(以Windows为中心,但各处的概念都是一样的):跨模块边界分配和释放内存