内存(new delete )

new

new 就是程序运行过程中申请空间的一种方式。你可以通过指针去访问这个地址。

delete

delete:当你用完这个对象之后,把内存还给内存池的一种方式。

Dynamic Arrays(动态申请数组)

int *p =new int ;
int *a=new int [10];
假设student 是个类
student *q =new student ();
student *r =new student[10]
在这里插入图片描述delete p;
a++ ;delete[] a;
delete q;
delete[] r;
delete用法小建议:
1.禁止用delete释放不是new分配出来的空间
2.禁止用delete两次释放同一块空间
3.如果new[],那么delete[]
4.如果new,那么delete;
5.如果你去delete一个null pointer(空指针) ,那么他是安全的。例子中的 int *b。

举个例子:代码如下。
a.h

#ifndef A_H
#define A_H


class A
{
public:
    A();
    ~A();
    void setI(int i);
    void f();
private:
    int num;
    int i;
    int *b;

};

#endif // A_H

a.cpp

#include "a.h"
#include <QDebug>

A::A()
{
    num=0 ;
    i=0;
    qDebug() << "进入构造函数" <<endl;
    b=0;  

}
A::~A(){
    if(b)delete b;  //最好加个if判断
    qDebug() << "进入析构函数, num ="+ QString::number(num) <<endl;
}
void A::setI(int i)
{

    num=i;
    //假设 private : int i;
    //则 这句话变成 this->i =i;前面的i是私有变量i 后面的i是函数setI的参数,.
    //this->i=i;
    

}
void A::f()
{
    qDebug() << "HELLO"  <<endl;
    b=new int; //不管这个有没有调用,没调用就是一个空指针。我的建议第五点
}

main.cpp

#include "widget.h"
#include <QApplication>
#include <a.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;//可以不用管
    w.show();//可以不用管
    A *p=new A[10];
    for (int i=0;i<10;i++)
    {
        p[i].setI(i);
    }
    delete[] p;
    return a.exec();

}

程序运行结果如下 :
在这里插入图片描述如果主函数改成 delete p;
则只会显示 “显示析构函数,num =0;”说明有类数组有没被析构的。
***看完记得点个赞谢谢老板。***
在这里插入图片描述

内存耗尽

虽然现代计算机配备了大容量的内存,但是自由空间消耗殆尽的情况还是有可能出现。一旦程序出现这种情况,new就创建失败,并且会抛出一个bad_alloc的异常。我们可以使用改变new的方式来阻止它抛出异常

//如果分配失败,new返回一个空指针
int *pi=new int;//假设new失败
int *p2=new (nothrow) int ;//如果分配失败,new返回一个空指针

我们俗称这种方式是定位new

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值