6

问题在标题中......我搜索但找不到任何东西。


编辑:

我真的认为没有必要解释这一点,但是因为人们认为我所说的没有意义(而且我问错了问题),所以问题就在这里:

由于人们似乎对所有问题的“根本”原因非常感兴趣,而不是对所提出的实际问题感兴趣(因为这显然有助于更好地解决问题,让我们看看是否有效),问题就在这里:

我正在尝试创建一个基于 NTDLL.dll 的 D 运行时库,以便我可以将该库用于 Win32 子系统以外的子系统。所以这迫使我只链接 NTDLL.dll。

是的,我知道这些功能是“未记录的”并且可能随时更改(即使我打赌一百美元,从现在起 20 年后wcstombs仍然会做同样事情,如果它仍然存在的话)。是的,我知道人们(尤其是微软)不喜欢链接到那个库的开发人员,我可能会因为这里而受到批评。是的,以上两点意味着在 Win32 子系统之前运行的 chkdsk 和碎片整理程序等程序甚至不应该首先创建,因为实际上不可能与 kernel32.dll 或 msvcrt.dll 之类的任何东西链接,并且仍然有 NT-native 可执行文件,所以我们开发人员应该假装这些阶段是我们永远无法企及的。

但是,我怀疑这里的任何人都希望我粘贴几千行代码并帮助我查看它们并试图弄清楚为什么没有失败的内存分配被我正在修改的源代码拒绝。所以这就是为什么我问了一个与“根本”原因不同的问题,尽管这被认为是社区的最佳实践。

如果事情仍然没有意义,请随时在下面发表评论!:)


编辑2:

经过大约 8 个小时的调试,我终于找到了问题所在:

事实证明,如果给它的指针是,RtlReAllocateHeap()不会自动工作。RtlAllocateHeap()NULL

4

4 回答 4

13

它必须指向块的开头。将空指针传递给 是安全的free(),但传递任何未分配的指针malloc()或其亲属之一将导致未定义的行为。有些系统会给你一个运行时错误——类似于“释放未分配的指针”。

编辑:

我编写了一个测试程序来获取错误消息。在我的机器上,这个程序:

#include <stdlib.h>

int main(int argc, char **argv)
{
  int *x = malloc(12);
  x++;

  free(x);

  return 0;
}

崩溃并显示此消息:

app(31550) malloc: *** error for object 0x100100084: pointer being freed was not allocated
于 2011-01-03T22:34:16.520 回答
4

您唯一可以传递给您的是从(或、、等)或 NULLfree返回给您的指针。malloccallocrealloc

我猜你在问,因为你有一些函数可以用来做 malloc,你想弄乱数据块,然后在完成后摆脱它,你不想被打扰保留周围原始指针的副本。它不是那样工作的。

于 2011-01-03T22:37:05.063 回答
1

从您添加到现有答案的评论中,您似乎在问错误的问题。如果你需要内存对齐,你为什么不问这个问题呢?询问根本问题,而不是询问您的感知解决方案!

所以如果你不介意我会回答你应该问的问题:

Win32 支持对齐的内存分配_aligned_malloc()。它更像是 POSIXmemalign()

如果您需要对齐分配的实现,实现起来相当简单:

void* aligned_malloc( size_t size, size_t alignment )
{
    void* unaligned = malloc( size + alignment ) ;
    void* aligned = (void*)(((intptr_t)unaligned + alignment) & ~(alignment - 1));
    void** free_rec_ptr = ((void**)aligned - 1) ;
    *free_rec_ptr = unaligned ;

    return aligned ;
}

void aligned_free( void* block )
{
    void** free_rec_ptr = ((void**)block - 1) ;
    free( *free_rec_ptr ) ;
}

The alignment argument must be a power of two.

于 2011-01-03T23:03:23.043 回答
0

FWIW, the last time I looked into how the C run time library worked with malloc and free, the block that malloc gives you actually has some extra words at negative offsets relative to the pointer it gives you. These say things like how big the block is, and other stuff. free relied on being able to find those things. Don't know if that sheds any light.

于 2011-01-05T14:37:54.307 回答