如果realloc失败并且返回NULL,那么前者缓冲区是免费的还是保持原样?我没有在手册页中找到特定的信息,我很不确定该怎么做.如果释放内存,则双重释放可能存在风险.如果不是,则会发生泄漏.
关于C中的realloc函数的简单问题:如果我使用realloc来缩小指针所指向的内存块,那么"额外"内存是否会被释放?还是需要以某种方式手动释放?
例如,如果我这样做
int *myPointer = malloc(100*sizeof(int));
myPointer = realloc(myPointer,50*sizeof(int));
free(myPointer);
Run Code Online (Sandbox Code Playgroud)
我会有内存泄漏吗?
让我们考虑一下这段很短的代码片段:
#include <stdlib.h>
int main()
{
char* a = malloc(20000);
char* b = realloc(a, 5);
free(b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在阅读了realloc的手册页后,我不完全确定第二行会导致释放19995个额外字节.引用手册页:The realloc() function changes the size of the memory block pointed to by ptr to size bytes.但是根据该定义,我可以确定其余的将被释放吗?
我的意思是,指向的块b肯定包含5个空闲字节,所以对于懒惰的顺从分配器是否足以让realloc行不做任何事情?
注意:我使用的分配器似乎释放了19 995个额外字节,如valgrind在注释掉free(b)行时所示:
==4457== HEAP SUMMARY:
==4457== in use at exit: 5 bytes in 1 blocks
==4457== total heap usage: 2 allocs, 1 frees, 20,005 bytes allocated
Run Code Online (Sandbox Code Playgroud) 我有两个问题.
不要realloc()和memcpy()阵列中的复制项目到另一个的方式更快的不仅仅是遍历每个元素O(N)?如果答案是肯定的,那么您认为它的复杂性是什么?
如果分配的大小小于原始大小,是否realloc()将条目复制到其他位置,或者只是将它们保留,因为它们会减小数组的大小?
关于管理对齐的内存块,我有一些相关的问题.跨平台的答案是理想的.但是,由于我非常确定不存在跨平台解决方案,因此我主要对Windows和Linux以及(在很大程度上)Mac OS和FreeBSD感兴趣.
在16字节边界上对齐大块内存的最佳方法是什么?(我知道使用琐碎的方法malloc(),分配一些额外的空间,然后将指针碰到一个正确对齐的值.虽然我希望能找到更少的东西.另外,请参阅下面的其他内容的问题.)
如果我使用普通旧的malloc(),分配额外的空间,然后将指针移动到正确对齐的位置,是否有必要将指针保持在块的开头以便释放?(调用free()指向块中间的指针似乎在Windows上实际运行,但我想知道标准是什么,即使标准说你不能,它是否在所有主要操作系统的实践中都有效.我不关心模糊的DS9K操作系统.)
这是一个艰难/有趣的部分.在保持对齐的同时重新分配内存块的最佳方法是什么?理想情况下,这将比调用malloc(),复制,然后调用free()旧块更智能.我想尽可能在适当的地方做.
从man realloc:realloc()函数返回一个指向新分配的内存的指针,该内存适用于任何类型的变量,可能与ptr不同,如果请求失败则为NULL.
所以在这段代码中:
ptr = (int *) malloc(sizeof(int));
ptr1 = (int *) realloc(ptr, count * sizeof(int));
if(ptr1 == NULL){ //reallocated pointer ptr1
printf("Exiting!!\n");
free(ptr);
exit(0);
}else{
free(ptr); //to deallocate the previous memory block pointed by ptr so as not to leave orphaned blocks of memory when ptr=ptr1 executes and ptr moves on to another block
ptr = ptr1; //deallocation using free has been done assuming that ptr and ptr1 do not point to the same address
}
Run Code Online (Sandbox Code Playgroud)
仅仅假设重新分配的指针指向不同的记忆块而不是同一个块就足够了.因为如果假设变为false并且realloc返回ptr指向的原始内存块的地址然后free(ptr)执行(由于评论中给出的原因)然后内存块将被删除,程序将疯狂.我应该放入另一个条件来比较ptr和ptr1的相等性并排除执行free(ptr)语句吗?
问题说这一切,但这里是一个例子:
typedef struct mutable_t{
int count, max;
void **data;
} mutable_t;
void pushMutable(mutable_t *m, void *object)
{
if(m->count == m->max){
m->max *= 2;
m->data = realloc(m->data, m->max * sizeof(void*));
}
// how to handle oom??
m->data[m->count++] = object;
}
Run Code Online (Sandbox Code Playgroud)
如何处理内存耗尽而不是所有数据的NULL?
编辑 - 让我们假设有些东西可以完成,比如在某处释放一些内存,或者至少告诉用户"你不能那样做 - 你的内存不足".理想情况下,我想留下那里分配的东西.
realloc引用说:
该功能可以将存储块移动到新位置,在这种情况下返回新位置.
这是否意味着如果我这样做:
void foo() {
void* ptr = malloc( 1024 );
unsigned char* cptr = ( unsigned char* )ptr+256;
ptr = realloc( ptr, 4096 );
}
Run Code Online (Sandbox Code Playgroud)
那么如果realloc移动块,cptr可能会变为无效?
如果是,那么以任何方式重新分配信号,它将移动块,以便我可以做一些事情来防止cptr变得无效?
realloc实际上是如何在后台工作的?如果在旧地方没有足够的可用内存,那么这个分配两个/多个内存块和一个指向该内存块的指针和其他指针内部相互链接或旧区域复制到新的位置,其中有足够的内存可用且指针正在更新到新地址并删除旧内存?
这realloc是编译器/操作系统依赖还是独立?
存在几个对齐版本的古老malloc(),例如:
#include <stdlib.h>
int posix_memalign(void **memptr, size_t alignment, size_t size);
void *aligned_alloc(size_t alignment, size_t size);
#include <malloc.h>
void *memalign(size_t alignment, size_t size);
Run Code Online (Sandbox Code Playgroud)
(分别来自POSIX,glibc和Linux libc).但是 - 我似乎无法找到任何realloc()支持对齐的版本.它真的没有实现过吗?将非对齐的功能realloc()与在对齐的malloc()变体中搜索对齐的内存块相结合似乎是微不足道的.
有关: