我试图使用free()释放动态分配的内存,但我发现它的作用是让参数指针指向某个新位置,并保留先前指向的位置,内存未被清除.如果我再次使用malloc,指针可能指向这个凌乱的块,它已经充满垃圾,这真的很烦人..
我是C的新手,我认为c ++中的delete []没有这个问题.有什么建议吗?
谢谢
由free内存刚刚从使用中释放.它是从分配给你释放的.它没有明确清除.某些旧内容可能存在于这些内存位置.为避免这种情况,有两种解决方案.
memset使用后分配内存后需要执行操作malloc.
代码示例:
unsigned int len = 20; // len is the length of boo
char* bar = 0;
bar= (char *)malloc(len);
memset(bar, 0, len);
Run Code Online (Sandbox Code Playgroud)
或者使用,默认情况下calloc()初始化内存0.
代码示例:
int *pData = 0;
int i = 10;
pData = (int*) calloc (i,sizeof(int));
Run Code Online (Sandbox Code Playgroud)
delete[]在c ++中没有这个问题.不
行为完全相同.除非你明确地将指针设置0为delete'd指针不会指向0.因此,0在删除指针后,请始终将指针设置为.
malloc,calloc反之亦然?由于calloc将分配的内存设置0为此可能需要一些时间,因此您可能希望使用malloc()该性能是一个问题.(Ofcourse One最常见的用途,看看这是否真的是一个问题)
如果初始化内存更重要,请使用calloc()明确为您执行的操作.
此外,某些操作系统(如Linux)具有Lazy Allocation内存模型,其中返回的内存地址是虚拟地址,实际分配仅在运行时发生.操作系统假定它能够在运行时提供此分配.
malloc在程序实际触摸它之前,分配的内存不由实际内存支持.
虽然,因为calloc初始化内存到0你可以确保操作系统已经用实际的RAM(或交换)支持分配.
realloc?是的,类似的行为malloc.
摘录自文档:
void * realloc ( void * ptr, size_t size );
Run Code Online (Sandbox Code Playgroud)
重新分配内存块
ptr参数指向的内存块大小将更改为大小字节,从而扩展或减少块中可用的内存量.
该功能可以将存储块移动到新位置,在这种情况下返回新位置.即使移动了块,内存块的内容也会保留到新旧大小中的较小者.如果新大小较大,则新分配的部分的值是不确定的.
如果ptr为NULL,则该函数的行为与malloc完全相同,分配一个大小字节的新块并返回指向它开头的指针.
如果大小为0,则先前在ptr中分配的内存被释放,就像调用free一样,并返回NULL指针.