c语言定义char*在函数内用完需要释放内存吗?char[]呢 - 爱问答

(爱问答)

c语言定义char*在函数内用完需要释放内存吗?char[]呢

void func() {

const char *a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char b[234] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

delete a;//需要这样做吗

delete b;//

}


char* charTest(){char p[] = "hello";return p;} char* p = charTest();调用玩char p[]被释放因为函数中的局部变量在函数调用结束后就会被释放;这句话是对的,局部变量超出其作用域后就会被释放掉所以如果你在函数内部定义一个指针,并申请了空间;这句不怎么对,因为只查动态申请的内存都是在堆中申请,不会被释放掉一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。5、程序代码区//main.cpp  int a=0;    //全局初始化区  char *p1;   //全局未初始化区  main()  {   int b;栈   char s[]="abc";   //栈   char *p2;         //栈   char *p3="123456";   //123456在常量区,p3在栈上。   static int c=0;   //全局(静态)初始化区   p1 = (char*)malloc(10);   p2 = (char*)malloc(20);   //分配得来得10和20字节的区域就在堆区。   strcpy(p1,"123456");   //123456放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。}

C没有提供由语句来释放已静态定义的数组的措施。有以下几种况:

  1. 定义在函数中的自动存储型数组,在函数被调用时创建,函数退出后自动释放;

  2. 定义在主函数中或所有函数之外的全局数组与程序的寿命一样长,不能中途释放;

  3. 用static修饰的静态数组,无论在何处定义,与程序的寿命一样长,不能中途释放;

  4. 用malloc函数申请的空间构成的数组,完成任务后可随时用free函数释放全部空间。


一时看不明白你的代码。一个原则是,start指向了谁。如果指向了在这个函数中定义的临时自动型数组,那必然存在返回局部数组指针的问题,就是你说的内存释放问题。这样虽然指针被返回了,但它指向的内容已经不受代码控制了,很危险。但如果start指向的是在主函数中声明的数组,或是全局或静态数组(这个函数中定义的静态数组也行),或者是用动态分配法获得的内存空间且未曾释放,则不存在任何问题,是完全合理合法的。用动态分配法时要注意在不用时释放内存空间,以免造成内存泄漏。

相关标签:内存c语言

下一篇:minecraft在哪下载

上一篇:在MyEclipse2016中如何配置struts-2.5.14.1版本的struts.xml

热门标签:
excel 网盘 破解 word dll
最新更新:
微软重新评估新的Outlook的使用时机 联想推出搭载联发科Helio G80芯片组的Tab M9平板 英特尔创新大赛时间确定! 微软Edge浏览器在稳定渠道中推出Workspaces功能 英伟达RTX4060TiGPU推出MaxSun动漫主题! 谷歌地图为用户提供了街景服务! GameSir 在T4 Kaleid中推出了一款出色的控制器! 微软开始在Windows 11 中测试其画图应用程序的新深色模式! LG电子推出全球首款无线OLED电视 英伟达人工智能芯片崭露头角! Steam Deck可以玩什么游戏-Steam Deck价格限时优惠 雷蛇推出CobraPro鼠标 Kindle电子阅读器可以访问谷歌商店吗 Windows10如何加入组策略 window10图片查看器怎么没有了?