而不是只使用free()并指针指向一些新块,如何真正清空以前指向的内存块?

Rac*_*hel 0 c

我试图使用free()释放动态分配的内存,但我发现它的作用是让参数指针指向某个新位置,并保留先前指向的位置,内存未被清除.如果我再次使用malloc,指针可能指向这个凌乱的块,它已经充满垃圾,这真的很烦人..

我是C的新手,我认为c ++中的delete []没有这个问题.有什么建议吗?

谢谢

Alo*_*ave 6

free内存刚刚从使用中释放.它是从分配给你释放的.它没有明确清除.某些旧内容可能存在于这些内存位置.为避免这种情况,有两种解决方案.

解决方案1:

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)

解决方案2:

或者使用,默认情况下calloc()初始化内存0.

代码示例:

  int *pData = 0;
  int i = 10;
  pData = (int*) calloc (i,sizeof(int));
Run Code Online (Sandbox Code Playgroud)

我认为delete[]在c ++中没有这个问题.


行为完全相同.除非你明确地将指针设置0delete'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指针.