尝试删除char *时出现运行时错误

时间:2014-05-29 09:52:41

标签: c++ memory-leaks char delete-operator

我有这段代码:

cout<<"Enter first name (maximum "<<MAX_LENGTH<<" letters):";
cin>>name;
cin.ignore();
name[MAX_LENGTH] = '\0';
fName = new char [strlen(name)];
strcpy(fName, name);
delete [] fName;

但是一旦它到达delete [] fName行,我就会收到运行时错误。 我从先前的帖子中发现,这是因为我在执行strcpy(fName, name);时将指针更改为已分配的内存。但我不知道该怎么做才能避免它。

3 个答案:

答案 0 :(得分:1)

fName = new char [strlen(name)];
strcpy(fName, name);
delete [] fName;

您分配了一个长度为strlen(name)的数组,但随后复制了strlen(name)+1个字符。这是因为strlen()返回一个排除空终止符的值。但是strcpy复制了空终止符。

这意味着对strcpy的调用超出了缓冲区的末尾,之后程序的行为未定义。

答案 1 :(得分:0)

如果name被声明为char name[MAX_LENGTH],则最大索引可以是MAX_LENGTH-1,因为数组的零基于索引。使用

name[MAX_LENGTH] = '\0';

访问超出限制的内存。使用

name[MAX_LENGTH-1]= '\0';

此外,name应该有MAX_LENGTH-1个字符。

cout<<"Enter first name (maximum "<<MAX_LENGTH-1<<" letters):";

fname必须与要复制的name一样大,如果要使用new取消分配必须 delete

答案 2 :(得分:0)

fName = new char [strlen(name)];
strcpy(fName, name);
delete [] fName;

问题是strcpy需要strlen(name)+1个字符(额外的一个用于结束0)。阅读有关C字符串表示的内容。