zoukankan      html  css  js  c++  java
  • 关于动态内存申请的指针该如何释放?

    示例代码

    #include<stdio.h>
    #include<stdlib.h>
    
    char* ToBin(int num)
    {
    	int flag=1;
    	char* result=(char*)malloc(sizeof(char)*33); //函数内动态申请内存,函数调用结束后该地址的内容不会被释放
    	int i;
    
    	for(int i=31;i>=0;i--)
    	{
    		if(num & flag)
    		{
    			result[i]='1';
    		}
    		else
    		{
    			result[i]='0';
    		}
    		flag<<=1;
    	}
    	result[32]='';
    	return result;
    }
    
    int main()
    {
    	int a1=28;
    	int a2=-28;
    	char* a;
    	int i=0;
    	printf("%s","I am CDQ!
    ");
    	a = ToBin(a1); //此时result指针被释放掉,指针a指向了动态内存
           //a= ToBin(a2);
    	printf("a1:");
    	for(int i=0;i<33;i++)
    	{
    		printf("%c",a[i]);
    	}
    	printf("%c",'
    ');
    	free(a); //该内存使用完后可以被释放了,不然会一直占用内存
    	a = NULL;
    
    	return 0;
    }
    

    ======================================
    百度知道
    问:两个指针指向同一个new开辟的空间,当释放其中一个指针后,为什么另一个指针还能操作这个空间?
    我在一个函数里开辟了一个空间,然后用指针b指向这段空间,再返回给main函数,用指针b接收,再让指针c也指向这段空间,然后我释放了b指向的这段空间(那不也是c指向的空间吗?)为什么释放后,c还能去操作这段空间。(delete不是释放new开辟的空间吗?要是空间被释放了,那所有指向这段空间的指针不是应该都不能再操作这段空间了吗?)

    在我理解中,delete是释放一个空间,不管多少个指针指向,只要以其中一个指针为载体,释放这空间后,其他指向这空间的指针就没有权限操作这空间了。

    答:
    1,C/C++没有授权这个概念,C语言(含C++)之所以称为程序bai员的语言就是说,作为程序员的你,权限是最大的,你可以做任何事情.访问权的管理是程序员的事情,就如同数组边界检查工作同样是程序员的事
    2,new只不过程序向系统申请一块可用内存,而系统会检索注册表(不是windows注册表)通过已占用内存计算出一块未被占用的且可以容纳申请长度的内存给程序,并且标记这块内存已占用,然后返回首地址,这个机制只不过防止内存重复分配,避免数据被其他程序覆盖掉,但是读写是开放的.
    3,通过指针DELETE,就是告知系统这个指针指向的地址空间我不要了,而系统做的事情仅仅是删掉这个注册记录,那么这个地址的空间下次可以再分配了,也就是回收了,但是内容不需要清掉,清理掉多此一举,太浪费CPU时间了,因为下次分配时程序会用数据或者通过初始化覆盖掉废弃的数据.
    因此当一个指针释放后,你的程序的其他指针还是指向原地址,而这块地址没被其他程序占用时,里面的数据还在,因此用其他指针访问它还是可以的,但是万一,在你释放后,多任务系统下,其他进程的线程马上申请了这块内存,那你程序读出的数据可能变化了,但是写的话就会干扰主权程序的运行.从而可能会导致系统奔溃.

  • 相关阅读:
    MySQL ==> Maxwell ==> Kafka ==> Spark
    HBase 基本操作
    Spark Streaming 整合Kafka的 Offset 管理 【数据零丢失之 checkpoint 方式管理Offset】
    数据零丢失 + 仅一次消费数据【终极方案】
    Spark大数据相关经典面试题总结 【一直更新...】
    Spark Streaming 整合Kafka的 Offset 管理 【数据零丢失之 MySQL管理Offset】
    InfuxDB 时序数据库入门+influxdb-java
    Connection to node 0 could not be established. Broker may not be available.
    天池新人实战赛之[离线赛]-初体验-Spark处理
    Java进阶【有空常翻出来看看】
  • 原文地址:https://www.cnblogs.com/chendeqiang/p/14225006.html
Copyright © 2011-2022 走看看