以下是代码:
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的剩余内存区域是免费的。是不是?
答案 0 :(得分:15)
没有。所有strlen()都会在字符串中查找第一个空字符('\ 0')。它没有释放内存。它甚至不关心它检查的内存是否正确分配。如果从您指定的指针开始找不到任何空字符,它将很乐意遍历已分配内存的末尾以搜索空字符。
答案 1 :(得分:7)
代码从一开始就被打破了。 str
不是以空字符结尾的字符串,因此无法与期望这些字符串的函数一起使用,例如strlen
或strcpy
。
答案 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()
的内存将被取消分配。