给出一个指向某些可变..有一种方式来检查它是否是静态或动态分配的??

有帮助吗?

解决方案

引用自己的评论意见:

im作方法,这将基本上摆脱的一个结构体。它有一个数据成员,这是一个指向的东西,可能或不可能了通过malloc分配的内存..这取决于哪一个,我想免费它

正确的办法是添加 另一个 成员的结构:指向一个重分配的功能。

它不仅仅是静态的和动态的分配。还有 几个 可能的分配,其中 malloc() 是只有一个。

在类Unix系统,它可能是:

  • 一个静态的变量
  • 在栈
  • 在堆,但进行动态分配(即 alloca())
  • 在堆中,分配 malloc()
  • 在堆中,分配 new
  • 在堆中,在中间的一系列分配 new[]
  • 在堆中,在一个结构分配 malloc()
  • 在堆中,在一个基类的一个目的分配 new
  • 分配 mmap
  • 分配有一定的分配器
  • 更多的选择,包括几种组合和变化的上述

在Windows,你还有几个运行时, LocalAlloc, GlobalAlloc, HeapAlloc (与几个堆,你可以容易地创建),等等。

你必须始终释放记忆正确的释放功能的分配。因此,无论是程序的一部分,负责分配的记忆也应该免费存储器,或者必须通过正确的释放功能(或包装它)的代码,它将免费存储器中。

你也可以避免整个问题无论是通过需要指针永远是分配与特定的分配或通过提供分配自己的(在所形成的一个函数来分配的存和可能的功能以释放的话)。如果你提供的分配自己,你甚至可以利用的技巧(如标记的指针)允许一个也使用静态的分配(但是我将不详谈这一方法)。

雷蒙德*陈 有一篇博客中约为它(Windows为中心的,但这些概念都是一样的): 分配和使存储器模块边界跨越

其他提示

ACE 库可以满足您的需求。您可以检查他们是如何做到的。一般来说,你可能不需要在第一时间这样做......

由于堆,堆栈和静态数据区通常占用不同的内存范围,因此可以通过对进程内存映射的深入了解来查看地址并确定它所在的分配区域。是架构和编译器特定的,因此它使您的代码移植更加困难。

大多数libc malloc实现通过在每个返回的内存块之前存储一个头来工作,该内存块具有字段(由free()调用使用),其具有关于块大小的信息,以及“魔术”值。这个神奇的值是防止用户意外删除未被分配的指针(或释放被用户覆盖的块)。它是非常特定于系统的,因此您必须查看libc库的实现,以确切了解其中的魔术值。

一旦你知道了,你将给定指针移回指向标题,然后检查它是否有魔术值。

你可以使用LD_PRELOAD或其他东西,像malloc调试器那样挂钩malloc()本身吗?如果是这样,您可以保留所有已分配指针的表并使用它。否则,我不确定。有没有办法获得malloc的簿记信息?

不是标准功能。
malloc库的调试版本可能有一些功能来执行此操作。

你可以将它的地址与你认为是静态的东西进行比较,并说如果你知道它应该来自哪个范围,那么只有当它远离它时才会进行malloced,但是如果它的范围是未知的,你就不能真正相信它这一点。

1。)获取您拥有的代码的地图文件。

2.)底层进程/硬件目标平台应该有一个内存映射文件,通常表示 - 内存的起始地址(堆栈,堆,global0,该块的大小,该内存块的读写属性。) p>

3.)从1中的mao文件获取对象的地址(指针变量)后,尝试查看该地址属于哪个块。你可能会有所了解。

= AD

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top