GCC或glibc中是否有任何标准化函数在对齐指针处分配内存块?像MSVC中的_align_malloc()一样?
我有代码,由于各种原因,我正在尝试从C运行时移植到使用Windows Heap API的代码.我遇到了一个问题:如果我重定向malloc/ calloc/ realloc/ free调用HeapAlloc/ HeapReAlloc/ HeapFree(使用GetProcessHeap的手柄),内存似乎是正确分配(无不良指针返回,没有抛出异常),但我的图书馆porting因某种原因说"未能分配内存".
我已尝试使用Microsoft CRT(使用下面的Heap API)和另一个公司的运行时库(使用下面的Global Memory API); 两者的malloc适用于库,但由于某些原因,直接使用Heap API不起作用.
我已经检查过分配不是太大(> = 0x7FFF8字节),而它们不是.
我能想到的唯一问题是内存对齐; 那是这样吗?或者除此之外,Heap API和我不知道的CRT内存API有根本区别吗?
如果是这样,它是什么?如果没有,那么为什么静态 Microsoft CRT(包含在Visual Studio中)在调用之前malloc/ calloc之前需要一些额外的步骤HeapAlloc?我怀疑存在差异,但我想不出它可能是什么.
谢谢!
我正在使用堆在堆上分配一些内存malloc().我正在向指针添加一个偏移量并将其返回到一个调用函数return ptr+(sizeof(char)*4)),例如,该函数存储该返回值ptrReturned.
最大的问题是,当我free(ptrReturned)从分配块的开头偏移时,是否sizeof(char)*4会释放整个块,还是从偏移中释放内存直到分配块的末尾?我正在使用的编译器是MSVC++ 2008.
如果分配的地址存储在链表中,并且有指向前一项的指针,那么它应该将整个块从前一个指针为NULL的位置释放到下一个指针为NULL的位置,对吧?
我已经尝试过调试和观察内存,但我无法覆盖释放的块空间.有没有办法可以在定义的地址上显式尝试和分配堆上的空间,并且可能因尝试分配已分配的内存而获得异常?这样我就能知道,如果有的话,当然没有更简单的答案.
我希望问题很清楚,如果我遗漏了一些信息,请在评论中告诉我.谢谢.
我只是在c语言上试验一下你能回答我关于我写的程序的问题
void main()
{
char *p,; // created a pointer pointing to string
p = (char *) malloc(50); // dynamically create 50 bytes.
strcpy(p, "this code is written about the dynamic allocation");
p += 20;
free(p);
}
Run Code Online (Sandbox Code Playgroud)
现在有人能告诉我free(p)语句的效果是什么,将释放最后30个字节并用于将来的内存分配.什么是输出?