在C语言中我们使用malloc()、calloc()、realloc()库函数来动态分配内存,当然也适用于C++,但在C++中有更好的方法———new运算符。
通过new来动态分配内存并返回分配的内存首地址。
例如: int *ps=new int ;
或者开辟一个内存块
int *pt=new int [10];
同样动态分配的内存 使用过后要记得回收给系统,用delete 释放
#include<iostream>
using namespace std;
int main()
{
int *ps= new int;
int *pt = new int [10];
delete ps;
delete [] pt;
return 0;
}
使用new ,delete要遵循以下规则:
1.不要使用delete来释放不是new分配的空间。
2.不要使用delete释放两次内存块。
3.new ,delete 和new [ ] ,delete [ ]要匹配使用。
4.对空指针NULL使用 delete 是安全的。
对于一个类来说 ,要用new给它的对象分配空间,就必须调该类的构造函数,创建出的对象如果系统不再使用的时候用delete来释放空间 就也要调用该类的析构函数来销毁对象。下面详细分析:
#include<iostream>
using namespace std;
class Test
{
public:
Test()
{
_data = 0; //初始化数据成员
cout << "test()" << this<<endl ;//调用构造函数打印一遍地址
}
~Test()
{
cout << "~test()" << this<<endl;//调用析构函数打印一遍当前对象地址
}
private:
int _data;
};
int main()
{
Test * pt = new Test; //分配一个对象
Test *ps = new Test[5];//分配五个对象
delete[] ps;
delete pt;
return 0;
}
以上程序执行的结果为:
new分配内存的时候调了构造函数,delete销毁的时候调了析构函数。
但是delete不是每次都调析构函数,在以下情况下析构函数会被调用:
1.对象是动态的,则执行完成定义该对象的程序块时,将调用该对象的析构函数。
2.如果对象是静态对象时,结束时调用。
3.对象是new创立的,并且当显式使用delete删除对象时,析构函数才会被调用。
new Test [5]的时候会多申请Test个字节用来存放5 也就是创建对象的个数,以便以后释放的时候释放。
delete []的时候会先取存放的对象的个数((int )ps -1)==N
再析构对象 for循环析构N次 释放。
最后关于定位new表达式
int array[10];
array[4]=0;
就等价于 new (array+4) int(4)
定位new表达式可以在已经开辟好的内存上创建对象,调用构造函数。
原型为 operator new(size_t ,where) where为该内存的首地址。