当前位置:  开发笔记 > 编程语言 > 正文

下面的代码真的可以在C/C++中释放内存吗?

如何解决《下面的代码真的可以在C/C++中释放内存吗?》经验,为你挑选了3个好方法。

这是代码:

int main()
{   
   char str[] = {'a','b','c',' ','d','e',' ',' ','f',' ',' ',' ','g','h','i',' ',' ',' ',' ','j','k'};
   cout << "Len = " << strlen(str) << endl;

   char* cstr = new char[strlen(str)];
   strcpy(cstr, str); 

   cstr[5] = '\0';

   cout << "Len= " << strlen(cstr) << endl;

   return 0;
}

//---------------
Result console:
Len = 21                                                                                                                                                                        
Len= 5

正如你所看到的那样,Len的cstr发生了变化.这意味着cstr的剩余内存区域是免费的.这样对吗?



1> Gary Jackson..:

不.所有strlen()都会在字符串中查找第一个空字符('\ 0').它没有释放内存.它甚至不关心它检查的内存是否正确分配.如果从你给它的指针开始找不到任何空字符,它将很乐意遍历已分配内存的末尾以搜索空字符.



2> SergeyA..:

代码从一开始就被打破了.str不是以空字符结尾的字符串,因此不能与期望这些字符串的函数一起使用,例如strlenstrcpy.



3> Pravar Jawal..:

正如你所看到的那样,Len的cstr发生了变化.这意味着cstr的剩余内存区域是免费的.这样对吗?

不,这不对.您为堆上的数组分配了内存,然后\0在数组之间的位置插入.因此,strlen报告数组的长度等于5(因为它通过查看\ 0字符来计算char数组的长度)但是在堆上仍然存在超过该索引的内存.为了释放记忆,你需要打电话delete [] cstr.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有