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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值