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

时间:2015-12-30 15:39:25

标签: c++ c

以下是代码:

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的剩余内存区域是免费的。是不是?

6 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:7)

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

答案 2 :(得分:5)

  

正如您所看到的那样,Len的cstr发生了变化。这意味着留下的记忆区域   cstr是免费的。是不是?

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

答案 3 :(得分:4)

没有。 new只分配一块你指定大小的内存。释放它的唯一方法是在其上调用delete

strlen是一个从起始地址解析内存并计算非NUL字节数的函数,这样的东西称为C字符串。

在内存中的某处放置一个NUL字节与为内存管理添加任何其他值没有什么不同。

答案 4 :(得分:4)

  

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

没有。 strlen仅返回数组中存储的字符串的长度,而不是数组本身的大小。字符串的长度可以是从0到strlen(str) - 1的任何位置,但cstr的大小始终为strlen(str)

数组的大小不会因为你存储一个较小的字符串而改变,如果你只填写一半,那么玻璃会变小。释放cstr指向的内存的 only 方法是使用delete运算符。

答案 5 :(得分:2)

不,这并不意味着仍然是str的内存区域是免费的

strlen(cstr)计算遇到NUL \0字符时字符串的长度。

在开始时,您分配了一个长度为22 char的char数组。用char NUL替换\0只会使strlen认为字符串长达5字符。在替换了char之后,它不会释放为本地char数组分配的其他17 char。

一旦函数char退出(因为它是本地数组),str数组main()的内存将被取消分配。