char *pCh=new char[256];
qDebug()<<"内容:"<<pCh<<endl;//输出T 内存没有清空,内容不可预测
qDebug()<<"sizeof:"<<sizeof (pCh)<<endl;//输出4,不是数组长度256。因为指针变量只占用4个字节,
qDebug()<<"strlen:"<<strlen(pCh)<<endl;//输出2,不是数组长度256或最长可存储合法字符数255。未清空,
memset(pCh,'\0',256);
qDebug()<<"清空后:"<<pCh<<endl;//无内容,数组已清空
qDebug()<<"清空后sizeof:"<<sizeof (pCh)<<endl;//输出4,不是数组长度256。因为指针变量只占用4个字节,
qDebug()<<"清空后strlen:"<<strlen(pCh)<<endl;//输出0。数组已经清空
memset(pCh,'a',254);//前254字符设置为'a'
qDebug()<<"前254字符设置为'a':"<<pCh<<endl;//结果为254个a
qDebug()<<"前254字符设置为'a'后sizeof:"<<sizeof (pCh)<<endl;//
qDebug()<<"前254字符设置为'a'后strlen:"<<strlen(pCh)<<endl;
/*
memset(pCh,'b',260);//前254字符设置为'b',程序异常终止
qDebug()<<"前260字符设置为'b',数据溢出:"<<pCh<<endl;
qDebug()<<"前260字符设置为'b',数据溢出 sizeof:"<<sizeof(pCh)<<endl;
qDebug()<<"前260字符设置为'b',数据溢出 strlen:"<<strlen(pCh)<<endl;
*/
char *p1=pCh;
char *p2=pCh;
//正常修改堆上数组内容
*p1='b';
qDebug()<<"内容:"<<pCh<<endl;//输出baa...
*(p1+1)='c';
qDebug()<<"内容:"<<pCh<<endl;//输出bca...
p1++;
p1++;
*p1='d';
qDebug()<<"内容:"<<pCh<<endl;//输出bcda...
//释放内存 后,该块内存,依然可以正常访问,甚至修改
delete pCh;//
qDebug()<<"pCh内容:"<<pCh<<endl;//输出bcda...
qDebug()<<"p1内容:"<<p1<<endl;//输出da...
qDebug()<<"p2内容:"<<p2<<endl;//输出bcda...
*pCh='x';
qDebug()<<"pCh内容:"<<pCh<<endl;//输出da...
delete[] pCh;
qDebug()<<"pCh内容:"<<pCh<<endl;//输出bcda...
qDebug()<<"p1内容:"<<p1<<endl;//输出da...
qDebug()<<"p2内容:"<<p2<<endl;//输出bcda...
*pCh='x';
qDebug()<<"pCh内容:"<<pCh<<endl;//输出da...
//释放内存后,一定记住要将指针设置为NULL
delete[] pCh;
pCh=NULL;
//对于简单类型(int char long float double)数组,delete与delete[]效果一致
//但是对于类对象数组,delete和delete[]效果不一致
//delete仅仅释放了类对象数组第一个对象的内存,而delete[]会依次释放类对象数组的全部对象
class aClass
{
public:
void test(){
qDebug()<<"测试"<<endl;
}
aClass()
{
p=new char[12];
qDebug()<<"堆上分配内存"<<endl;
}
~aClass()
{
delete[] p;
qDebug()<<"堆上释放内存"<<endl;
}
private:
char *p;
};
aClass* pClassArray1=new aClass[8];
qDebug()<<"使用delete释放类对象数组:"<<endl;
delete pClassArray1;//只调用了第一个对象的析构函数
pClassArray1->test();//依然可正常访问
(pClassArray1+1)->test();//依然可正常访问
aClass* pClassArray2=new aClass[8];
qDebug()<<"使用delete[]释放类对象数组:"<<endl;
delete[] pClassArray2;//依次调用了类对象数组所有对象的析构函数
pClassArray2->test();//依然可正常访问
(pClassArray2+1)->test();//依然可正常访问
//正确的类对象数组释放方式
aClass* pClassArray3=new aClass[8];
//使用...
delete[] pClassArray3;
pClassArray3=NULL;