这一节来梳理有关动态内存管理的内容。
首先是C++风格的动态内存的创建与释放,指得是new
和delete
关键字的使用,相较于C语言的malloc
和free
他们的功能更加丰富,使用也更加方便。
啃书《C++ Primer Plus》 面向对象部分 动态内存管理(中) 动态对象的创建 重载new和delete
《动态内存管理》内容思维导图如下:
动态内存的分配与释放
new和delete关键字的使用
new和delete
new
和delete
关键字是C++动态内存的基础,用于分配和释放动态内存。
相较于C语言的malloc
,new
在申请内存时可以不必考虑具体内存的大小而是专注于根据怎样的类型来申请内存,它会自动计算所给类型的大小并为之申请相应大小的空间。
它的用法如下:
new 类型名称;
new 类型名称(初始化数据);
对于前一种,编译器会给予变量默认的赋值。对于基本类型,这个值是0,对于对象则会调用其无参构造函数。
语句的执行结果将是该类型的指针,指向刚刚分配的内存。
将上面的用法补写完整就是:
类型名称 * 指针名称 = new 类型名称;
类型名称 * 指针名称 = new 类型名称(初始化数值);
这块分配出来的内存与常规定义变量分配的内存块不同,这些内存是分配在堆区(自由存储区)而非栈区。因此即使指向其指针的作用域失效,该内存也不会像栈区变量那样被释放,而是会继续保留。如果没有及时的清理或是寻找另一个继续指向他的指针。该快内存就会变得不能访问,却依然占据着空间。
因此,申请了动态内存,还应当在使用完后将其“归还”给计算机。(好借好还,再借不难嘛)
将内存归还也就是释放,需要使用到delete
关键字。
用法如下:
delete 指针;
需要注意的是:
new
和delete
关键字必须搭配使用,即申请的动态内存必须进行释放,否则将会造成内存泄漏。- 应当避免对同一动态内存的多次释放,会造成未知的问题。
delete
对于空指针是安全的- 不要使用
delete
释放非new
关键字分配的内存
看下面一个例子
int main()
{
int* pI = new int;
double* pD = new double(3.14);
std::cout << *pI << std::endl;
std::cout << *pD << std::endl;
delete pI;
delete pD;
}
执行结果: