delete操作符

2014-11-23 23:18:16 · 作者: · 浏览: 4
今天下午试着用了一下static变量,结果发现自己平时在使用delete时的好多错误。就因为我把 delete [] pointer 写成 delete pointer [],让我调试了将近二十分钟。
先看一下我当时写掉static的代码,当然重点不是static。
[ html]
#include
using namespace std;
class Test
{
public:
Test()
{
cout<
number++;
}
~Test()
{
cout<
number--;
}
int getNumber()
{
return number;
}
private:
static int number; //属于这个类而非单个的对象
};
int Test::number = 0; //静态成员在使用前必须初始化
int main()
{
Test* pointer=new Test[3];
cout<getNumber()<
delete [] pointer;
return 0;
}
#include
using namespace std;
class Test
{
public:
Test()
{
cout<
number++;
}
~Test()
{
cout<
number--;
}
int getNumber()
{
return number;
}
private:
static int number; //属于这个类而非单个的对象
};
int Test::number = 0; //静态成员在使用前必须初始化
int main()
{
Test* pointer=new Test[3];
cout<getNumber()<
delete [] pointer;
return 0;
}运行结果:
[cpp]
1++++++++++ //执行Test()
2++++++++++
3++++++++++
3 pointer->getNumber();
3---------- // ~执行Test()
2----------
1----------
1++++++++++ //执行Test()
2++++++++++
3++++++++++
3 pointer->getNumber();
3---------- // ~执行Test()
2----------
1----------
new Test[3]生成了三个对象,即执行了三次Test(),所以number++执行了三次,即为3.
在销毁用new开的数组的时候必须在delete之后添加[ ].否则会造成内存泄漏。将上述代码中的delete [] pointer 换成delete pointer之后的运行结果如下:
[html]
1++++++++++ //执行Test()
2++++++++++
3++++++++++
3 pointer->getNumber();
3---------- // ~执行Test()
1++++++++++ //执行Test()
2++++++++++
3++++++++++
3 pointer->getNumber();
3---------- // ~执行Test()在销毁动态数组的时候,如果在delete之后木有[],析构函数就只执行一次。所以在销毁动态数组掉时候一定要记得加[].
通常在我们销毁了pointer之后就应该将pointer置NULL,否则pointer将会成为野指针。
在使用delete pointer 的时候只是将pointer所指掉变量清除,并不是将指针变量本身清除,所以在delete前后,pointer本身掉值是不变的,看下面的代码:
[html]
class Test
{
};
int main()
{
Test* pointer=new Test[3];
cout<<"在delete之前pointer的值 "<
delete pointer ;
cout<<"在delete之后pointer的值 "<
pointer=NULL;
cout<<"pointer置空后的值 "<
return 0;
}
class Test
{
};
int main()
{
Test* pointer=new Test[3];
cout<<"在delete之前pointer的值 "<
delete pointer ;
cout<<"在delete之后pointer的值 "<
pointer=NULL;
cout<<"pointer置空后的值 "<
return 0;
}运行结果:
[cpp]
在delete之前pointer的值为 0x8963008
在delete之后pointer的值为 0x8963008
pointer置空后的值为 0
在delete之前pointer的值为 0x8963008
在delete之后pointer的值为 0x8963008
pointer置空后的值为 0所以在将pointer delete之后一定要记得pointer=NULL,否则pointer就会成为野指针....这个危害就不说了.......