您的位置:首页 > 编程语言 > C语言/C++

C++ 笔记 关于动态内存分配 (new / delete)

2017-02-24 02:38 399 查看
C语言里面的动态内存分配用的是
malloc()
/
calloc()
free()


其中,malloc用于分配一个单位的内存,返回指针。例如malloc(sizeof int)

calloc用于分配多个内存,形成数组,返回指向第一个位置的指针。例如calloc(10,sizeof int)

free(*ptr)用于释放ptr指向的空间

另外还有一个realloc(*ptr,size)可以为ptr指向的空间重新分配一个size大小的空间。

C++中的动态内存分配

c++里面就增加了两个关键字new 和 delete用于实现刚才所述的功能。

//分配一个int大小的空间给ptr
int* ptr = new int;
//array指向100个int空间数组的第一个位置
int* array = new int[100];
//释放单一空间
delete ptr;
//释放数组空间,如果没有[],只会释放数组的第一个空间
delete[] array;


其中,分配的空间可以是基本类型,也可以是自定义类,或者结构体等。

这种功能经常用在需要重新改变大小的容器类里面,但是这里面有一个问题需要注意

如果在类的构造函数里面或者内部函数里面分配给指针的空间不需要了,就应该释放。

比如,如果某个功能是给private成员指针分配新空间,就需要先把原来的空间给释放,否则原来的空间就会一直存在,直到程序结束,这会造成内存泄漏。

即便是这个内存空间没有指针指向它,也需要先释放。

这一点跟java不同,java的虚拟机会自动回收没有指向的空间。但是c++里面需要手动释放。

以上这一段可以从实际操作中发现,windows的任务管理器可以看到程序占用内存大小。如果没有释放,占用内存就会显著增大,反之如果释放了,内存大小就不会变化。

还有一点,我发现,如果是用
int* ptr = new int
形式创建的内容是需要释放的,如果是
int a = 100
这样创建的内容是不需要的.

并且,不能用delete释放非new创建的内容

在类的定义里面创建了一个数据成员,

如果使用的是new 指针的形式,就需要在析构函数里面将其释放。

如果是数据名的形式,就不需要/无法手动释放,在这个类被销毁的时候会自动被释放。

这一点有待确认,实际操作中貌似是对的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息