c++特有的动态分配内存new操作符

来源:互联网 发布:windows平板电脑 i5 编辑:程序博客网 时间:2024/04/28 09:02

在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为该内存的首地址。

0 0