what:什么是动态内存?
c++中,普通变量(非static对象)存储在栈内存中,静态变量(局部static、类static)存储在静态内存中,在系统中还存在另外一种内存池,这部分内存供程序来分配,一般称作“自由空间“(free store)或”堆“(heap)。
where & When:在哪里何时使用动态内存?
以往学的变量中,全局对象在程序启动时创建,程序结束时销毁;局部对象在进入程序块时被创建,在离开块时被销毁;局部static对象在第一次使用时被创建,在程序结束时被销毁。可是有时候我们需要另外一种对象,其生存期与它们在哪里创建是无关的,只有当显式被释放时,这些对象才被销毁,这就是动态对象。动态对象调用动态内存。
how:怎样开始使用动态内存?
- 使用new动态分配和初始化对象
- 两种初始化方式:默认初始化和值初始化
-
//第一种初始化方式:默认初始化: string *ps = new string ; // 初始化为空的string int *ps = new int ; //并未对ps所指向的内存进行初始化
//第二种初始化方式:值初始化: string *ps = new string ; // 初始化为空的string int *ps = new int ; // 初始化0
- 使用delete删除对象
- new分配的自由空间必须用delete删除,否则该内存会一直占用到计算机重启。(内存泄露)
- delete删除过后的指针指向未定义,此时的指针称为“空悬指针”,调用空悬指针的危害等于调用野指针。(空悬指针在离开作用域后自动销毁)
- delete只能用来删除动态分配的对象,可是一般情况下编译器不能识别对象是动态还是静态,这需要程序员来识别。
- 不能对同一对象删除两次。delete pi ; 在第一次删除pi后,pi已经指向了一个未定义的内存,此时delete该内存会影响pi指向的未定义的自由空间,该堆内存会被破坏。(严重危害)
why:为什么使用动态内存?
为了降低c++直接管理内存的难度,C++11推出了智能指针特性优化了这种内存管理。明天继续~晚安~
时间: 2024-08-06 20:03:52