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;