gpt4 book ai didi

检查是否有东西被 malloced

转载 作者:太空狗 更新时间:2023-10-29 17:00:13 25 4
gpt4 key购买 nike

给定一个指向某个变量的指针..有没有办法检查它是静态分配的还是动态分配的?

最佳答案

引用您的评论:

im making a method that will basically get rid of a struct. it has a data member which is a pointer to something that may or may not be malloced.. depending on which one, i would like to free it

正确的方法是向结构添加另一个成员:指向释放函数的指针。

这不仅仅是静态分配与动态分配。有几个可能的分配器,malloc() 只是其中一个。

在类 Unix 系统上,它可能是:

  • 静态变量
  • 在堆栈上
  • 在堆栈上但动态分配(即 alloca())
  • 在堆上,用malloc()分配
  • 在堆上,用new分配
  • 在堆上,在用 new[] 分配的数组中间
  • 在堆上,在使用 malloc() 分配的结构中
  • 在堆上,在用 new 分配的对象的基类中
  • 分配给 mmap
  • 使用自定义分配器分配
  • 更多选项,包括上述选项的多种组合和变体

在 Windows 上,您还有多个运行时,LocalAllocGlobalAllocHeapAlloc(具有多个您可以轻松创建的堆),以及等等。

您必须始终为您使用的分配器使用正确的释放函数来释放内存。因此,负责分配内存的程序部分也应该释放内存,或者您必须将正确的释放函数(或围绕它的包装器)传递给将释放内存的代码。

您还可以通过要求始终使用特定分配器分配指针或自己提供分配器(以分配内存的函数和可能释放内存的函数的形式)来避免整个问题。如果您自己提供分配器,您甚至可以使用技巧(如标记指针)来允许一个人也使用静态分配(但我不会在这里详细介绍这种方法)。

Raymond Chen有一篇关于它的博客文章(以 Windows 为中心,但概念在任何地方都是相同的):Allocating and freeing memory across module boundaries

关于检查是否有东西被 malloced,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/276612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com