堆内存的创建与释放

首先我们介绍内存的三种存储方式

静态区:全局变量

堆区:程序执行时分配的内存

栈区:函数调用,局部变量

而特殊的是:堆区 内存是利用new创建

注意:当程序执行完毕后,所分配的堆区内存不会自主释放,会出现内存泄漏,即new要与delete一起出现,自己回收堆区内存

new的使用方法:

数据类型 指针=new 数据类型

int p=new int;

或者 int *p;

p=new int;

该代码的含义是:p指向一个由new分配到堆区的空间,简言之,用new在堆区开辟了一处空间,而空间地址存储到指针p里面

如何初始化

数据类型 指针=new 数据类型(初值)

举例:int *p=new int(100);

再如:char *ptr=new char('a');

如何堆内存的释放

delete——删除堆内存

用法:delete 指针变量

例如:

int *p=new int(100);
cout<<*p;
delete p;

new[]和delete[]

我们知道new/delete用于单个变量的创建与释放

而new[]和delete[]用于多个连续变量(数组)的创建与释放

语法:指针类型 指针变量=new 数据类型[元素个数]

例:int *p=new int[20];

new申请了连续二十个整数所需要的空间

堆内存的创建与释放_第1张图片

 语法:delete []指针变量

举例:delete[20] p

以下代码示例

#include
using namespace std;
class A{
public:
    A(int m){
        x=m;
        p=new int;  //初始化阶段将指针p指向的地址在堆区建立
    }
    A(const A&a){
        x=a.x;
        p=new int; //这里是给对象a2的属性指针指向的地址再到堆区建立一块空间,如果不建立,a1和a2的指针指向的地址在堆区中占的内存是一样的,会导致重复删除堆区内存的错误
        *p=*a.p;   //通过解引用的方式实现值传递
    }
    ~A(){
        delete p;  //将堆区建立的内存删除
    }
private:
    int x;
    int *p;
};
int main(){
    A a1(2);
    A a2=a1;
}

你可能感兴趣的:(jvm)