【问题标题】:How to allocate memory at a specific location如何在特定位置分配内存
【发布时间】:2013-09-30 01:13:10
【问题描述】:

这是给 C 的。

我认为 malloc 通常会在最后一次分配之后分配堆上的下一个可用空间。

是否可以让 malloc 不这样做并选择您希望在堆上分配内存的位置?

一般有什么方法可以在堆上分配内存,让它不是下一个可用地址,而是“更远”的地址吗?

基本上,我的 malloc 空间 + 更多空间被覆盖(作为测试),所以我丢失了与 malloc 空间相关的元数据,因为它存储在 malloc 空间旁边(即使我使用不同的 malloc 调用)。

谢谢, 杰里米

【问题讨论】:

  • 对于内存管理错误,请尝试valgrind(它在 Linux 和其他一些系统上可用)。你对malloc 的看法是错误的。另请阅读ASLR。所以一般你不能在特定位置分配内存。告诉我们更多关于您的操作系统、编译器、库(包括标准 C 库)和您的软件的信息。
  • “覆盖(作为测试)”是什么意思?你的意思是你是故意覆盖,还是在测试期间覆盖?
  • 如果您的元数据被覆盖,我会查看您正在使用内存的代码,可能是以不正确的方式。看到那段代码会很有帮助。

标签: c memory memory-management malloc


【解决方案1】:

不,没有办法告诉malloc 您希望在堆上分配空间。

malloc 的返回值主要取决于两件事:您的库正在使用的malloc 的版本(有很多)和分配的块的大小。

【讨论】:

  • 另外,对不起,我应该马上提到分配的事情以避免混淆,这是我第一次来这里,我还没有很好的感觉,因为没有与那种东西越界。再次感谢。
【解决方案2】:

要临时解决由malloc 分配的内存块的内存损坏,只需分配比您通常需要的更多的内存,以便您的块更大。这将在您的程序受到不利影响之前为他们提供更多空间进行错误修改。

出于临时调试目的执行此操作,以便您可以调查程序的行为,同时找出问题所在。

此外,还有其他技术可用于分析不正确的内存访问,包括分析器(如 valgrind)和调试器“观察点”功能,它们会中断程序并在所选位置被修改时通知您。

【讨论】:

  • 非常感谢所有的答案。通过测试,我的意思是它是为了分配;但是我不想太具体,因为我不是在寻求解决方案,我只是想尝试使用我关于替换一些元数据的想法。我认为填充(分配更多内存)会起作用,谢谢。发生的事情基本上是测试 memcpy 的元数据到内存中的另一个位置,释放指针,然后 memcpy 的原始数据到它的原始位置并再次尝试释放,因此愚弄元数据认为可以双重释放然后崩溃。
  • @jeremyradcliff:我不希望memcpy 实现仅依赖于存储在分配块附近的元数据。管理内存分配是一个复杂的问题(部分原因在于不同应用程序的许多不同行为模式),因此有多种方法。内存分配器可以将其自己的数据库与分配的块完全分开,由块的地址键控。它甚至可能有用于不同目的和分配大小的区域,在不同的区域中使用不同的数据库方法。
  • 感谢 Eric,这真的很有趣。我现在无法实现这样的东西,但希望很快。我一定会记住你说的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
相关资源
最近更新 更多