C++ 帮我看看这个指针数组的析构函数有什么问题,报错了

来源:百度知道 编辑:UC知道 时间:2024/06/14 16:58:53
#include<iostream.h>
class student
{
private:
char *rank[3];
public:
student()
{
for(int i=0;i<3;i++)
{
rank[i]=new char[20];
rank[i]="rank";
}
}
void display()
{
for(int i=0;i<3;i++)
{
cout<<rank[i]<<endl;
}
}
~student()
{
delete []rank; //这句话有错误
}
};
void main()
{
student s1;
s1.display();
}

你这个程序其实有两个错误,都是比较严重的:
1.
rank[i]=new char[20];
rank[i]="rank"; //这个赋值方法是错误的
你先给rank[i]分配了空间,这一句没有问题,
然后又用了rank[i]="rank"这一句,
这一句的处理是将rank[i]这个指针指向了常量"rank"的首地址,
这样有两个问题:
一.导致一开始给rank[i]分配的空间变成了没有指针指向的垃圾地址,内存泄漏发生了
二.导致rank[i]这个指针指向了常量区,无法进行delete操作

正确的应该是使用strcpy来进行赋值:
rank[i]=new char[20];
// rank[i]="rank";
strcpy(rank[i],"rank");

2.
new和delete要配对使用,应该这样:
// delete []rank; //这句话有错误
for(int k=0;k<3;k++)
delete []rank[k];

所以正确的程序应该如下:
#include<iostream.h>
#include<string.h> //增加这个头文件,因为需要使用strcpy
class student
{
private:
char *rank[3];
public:
student()
{
for(int i=0;i<3;i++)
{
rank[i]=new char[20];
// rank[i]="rank";
strcpy(rank[i],"rank");
}
}
void