CSevenView::CSevenView()
{
// TODO: add construction code here
//-----------Begin------------------------------------------------------------------------
//这是测试指针delete 与delete []释放的问题,
CString str=_T("计算机科学与技术");
int length=WideCharToMultiByte(CP_OEMCP,NULL,str,-1,NULL,0,NULL,FALSE);
char * strAb=new char[length+1];
memset (strAb, 0, (length +1) * sizeof (char));
WideCharToMultiByte (CP_OEMCP,NULL,str,-1,strAb,length,NULL,FALSE);
delete [] strAb;
//```````````````````````````````````````````````````````````````````
// 测试结果:其实delete 与delete []没什么区别。 `
// 用new[]开辟的空间,用delete释放不会出现内存泄露 `
// 但一般强调用new[]开辟的空间,最好用delete[]释放最合理。
// 测试总结:当我们用new【】分配的是基本数据类型时,用delete 和delete[]是没区别的,
// 但当我们用new【】分配的是自定义数据类型时,必须掉用delete[]的析构函数才行。
//````````````````````````````````````````````````````````````````````
//-----------End--------------------------------------------------------------------------
//-----------Begin------------------------------------------------------------------------
/*A*/ int * p=new int[100];
/*B*/ int num[100];
/*C*/ p=num;
/ *D*/ delete []p;
//测试结果:程序崩溃。
//因为在p=new int [100]时 P的地址是指向堆中的一块内存区域。
//当程序执行到p=num时,此时的P已经改变了,不在是指向堆的那块开配的区域。
//当执行到delete [] p时,程序崩溃,原因是P现在指向的是num ,而num是在栈上的开辟的空间
//-----------End--------------------------------------------------------------------------
//-----------Begin------------------------------------------------------------------------
/*A*/ int * p = new int[100];
/*B*/ *p=1;
/*C*/ p++;
/*D*/ *p=2;
/*E*/ delete [] p;
//测试结果:程序崩溃。
//原因是:代码段在A处,P是指向堆中开辟的内存区域,到了C处P的地址已经被改变了,
//而在系统指针的释放(中堆中释放内存)是重首地址开始的,现在首地址被改变了,故程序崩溃
//在堆中内存的释放只可以从首地址开始释放。
//改如下:
// /*A*/ int * p = new int[100];
// /*B*/ int * pack=p;
// /*C*/ *p=1;
// /*D*/ p++;
// /*E*/ *p=2;
// /*F*/ delete [] pack;
//````````````````````````````````````````````````````````````````````
//-----------End--------------------------------------------------------------------------
//-----------Begin------------------------------------------------------------------------
/*A*/ int * p =new int[10];
/*B*/ int * pLink=p;
/*C*/ delete []p;
/*D*/ delete []pLink;
//测试结果:程序崩溃
//原因:因为程序段只在堆中开辟了块内存区域,只是让 p ,pLink同时指向这个堆内存区,
//当执行C时,开辟的内存已被释放了,在执行到D时,发现去释放已经被释放完的堆内存,故程序崩溃。
//并没有new int【】二次,所以只需要一个释放就行。
//-----------End--------------------------------------------------------------------------
//-----------Begin------------------------------------------------------------------------
/*A*/ int num=100;
/*B*/ int * p= & num;
/*C*/ delete p;
//程序测试:程序崩溃。
//原因是:p是指向的一个变量,而用delete 来释放是有问题的,变量是在栈上开辟的,是由系统自己释放,
//而程序C处确强制delete掉,故崩溃。
//-----------End--------------------------------------------------------------------------
{
// TODO: add construction code here
//-----------Begin------------------------------------------------------------------------
//这是测试指针delete 与delete []释放的问题,
CString str=_T("计算机科学与技术");
int length=WideCharToMultiByte(CP_OEMCP,NULL,str,-1,NULL,0,NULL,FALSE);
char * strAb=new char[length+1];
memset (strAb, 0, (length +1) * sizeof (char));
WideCharToMultiByte (CP_OEMCP,NULL,str,-1,strAb,length,NULL,FALSE);
delete [] strAb;
//```````````````````````````````````````````````````````````````````
// 测试结果:其实delete 与delete []没什么区别。 `
// 用new[]开辟的空间,用delete释放不会出现内存泄露 `
// 但一般强调用new[]开辟的空间,最好用delete[]释放最合理。
// 测试总结:当我们用new【】分配的是基本数据类型时,用delete 和delete[]是没区别的,
// 但当我们用new【】分配的是自定义数据类型时,必须掉用delete[]的析构函数才行。
//````````````````````````````````````````````````````````````````````
//-----------End--------------------------------------------------------------------------
//-----------Begin------------------------------------------------------------------------
/*A*/ int * p=new int[100];
/*B*/ int num[100];
/*C*/ p=num;
/ *D*/ delete []p;
//测试结果:程序崩溃。
//因为在p=new int [100]时 P的地址是指向堆中的一块内存区域。
//当程序执行到p=num时,此时的P已经改变了,不在是指向堆的那块开配的区域。
//当执行到delete [] p时,程序崩溃,原因是P现在指向的是num ,而num是在栈上的开辟的空间
//并且p的地址是指向栈的,而在系统中栈中开辟的地址是有系统本身去释放,
//而代码段C处却强制释放栈中开辟的空间
//故程序崩溃。//-----------End--------------------------------------------------------------------------
//-----------Begin------------------------------------------------------------------------
/*A*/ int * p = new int[100];
/*B*/ *p=1;
/*C*/ p++;
/*D*/ *p=2;
/*E*/ delete [] p;
//测试结果:程序崩溃。
//原因是:代码段在A处,P是指向堆中开辟的内存区域,到了C处P的地址已经被改变了,
//而在系统指针的释放(中堆中释放内存)是重首地址开始的,现在首地址被改变了,故程序崩溃
//在堆中内存的释放只可以从首地址开始释放。
//改如下:
// /*A*/ int * p = new int[100];
// /*B*/ int * pack=p;
// /*C*/ *p=1;
// /*D*/ p++;
// /*E*/ *p=2;
// /*F*/ delete [] pack;
//````````````````````````````````````````````````````````````````````
//-----------End--------------------------------------------------------------------------
//-----------Begin------------------------------------------------------------------------
/*A*/ int * p =new int[10];
/*B*/ int * pLink=p;
/*C*/ delete []p;
/*D*/ delete []pLink;
//测试结果:程序崩溃
//原因:因为程序段只在堆中开辟了块内存区域,只是让 p ,pLink同时指向这个堆内存区,
//当执行C时,开辟的内存已被释放了,在执行到D时,发现去释放已经被释放完的堆内存,故程序崩溃。
//并没有new int【】二次,所以只需要一个释放就行。
//-----------End--------------------------------------------------------------------------
//-----------Begin------------------------------------------------------------------------
/*A*/ int num=100;
/*B*/ int * p= & num;
/*C*/ delete p;
//程序测试:程序崩溃。
//原因是:p是指向的一个变量,而用delete 来释放是有问题的,变量是在栈上开辟的,是由系统自己释放,
//而程序C处确强制delete掉,故崩溃。
//-----------End--------------------------------------------------------------------------
}