这是代码:
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的剩余内存区域是免费的.这样对吗?
不.所有strlen()都会在字符串中查找第一个空字符('\ 0').它没有释放内存.它甚至不关心它检查的内存是否正确分配.如果从你给它的指针开始找不到任何空字符,它将很乐意遍历已分配内存的末尾以搜索空字符.
代码从一开始就被打破了.str
不是以空字符结尾的字符串,因此不能与期望这些字符串的函数一起使用,例如strlen
或strcpy
.
正如你所看到的那样,Len的cstr发生了变化.这意味着cstr的剩余内存区域是免费的.这样对吗?
不,这不对.您为堆上的数组分配了内存,然后\0
在数组之间的位置插入.因此,strlen
报告数组的长度等于5(因为它通过查看\ 0字符来计算char数组的长度)但是在堆上仍然存在超过该索引的内存.为了释放记忆,你需要打电话delete [] cstr
.