-
new(可以通过指针访问)
-
new int;(分配空间)
-
new Stash(类);(先分配空间,再调用构造函数)
-
new int[10];
-
-
delete
-
delete p;(delete 这个对象,先析构,再收回空间)
-
delete[] p;
-
int * psome=new int [10];//有多个数据
delete [] psome;
//如果使用不带[]的delete,psome只有第一个数据被delete
int *p=new int;
int *a=new int[10];
Student *q=new Student();
Student *r=new Student[10];
//曾经new的空间都会有记录
delete p;//查找p的地址,收回p的空间,并抹去记录
a++;
delete[] a;//a++后,a的地址改变,与记录不符合,delete查找不到a的地址,会报错
delete q;//首先调用析构(原因:根据q的类型,调用Student的析构),然后通过记录查找比对,收回空间
delete r;//调用r所指的对象的析构,只析构了一个,但是空间都收回了
delete[] r;//加上[],知道是多个数据,将所有数据都析构完,再收回空间
#include<iostream>
using namespace std;
class A{
private:
int i;
int *p;
public:
A(){p=0; i=0;cout<<"A::A()"<<endl;}
~A(){if(p) delete p;cout<<"A::~A(),i="<<i<<endl;}//p可以是new的,也可能不是,需要写delete,if(p)可以不写,最好写一下,就算不是new的,也可以delete
//void set(int i){i=i;}根据就近原则,本局中屏蔽了成员变量i,所以需改成以下句子:
void set(int i){this->i=i;}
void f(){p=new int;}
/* A(){p=new int;i=0;cout<<"A::A()"<<endl;}
~A(){delete p;cout<<"A::~A(),i="<<i<<endl;}*/
};
int main()
{
A* p=new A[10];
for(int i=0;i<10;i++){
p[i].set(i);
}
delete[] p;
return 0;
}
运行结果:
delete[]是与new反过来的。
如果申请的内存,没有delete,可能会造成内存泄漏。