我们在用动态内存分配时,可以使用new
在动态内存中为对象分配空间并返回一个指向该对象的指针,比如说int* ptr = new int(1);
,在自由空间构造一个int
型对象,并返回指向该对象的指针给int* ptr
。(注意:ptr
只是一个变量,就像是int a=1;
中的a
一样,不过a
是整形变量,而ptr
是指针变量)。
为了防止内存耗尽,在动态内存使用完毕后,我们必须将其归还给系统。通过delete将动态内存归还给系统:delete ptr;
。需要注意的是释放一个指针(delete ptr;
)实际是删除了ptr
所指的目标(变量或对象),释放了它所占的堆空间,而不是删除指针ptr
本身(指针ptr
本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放,指针ptr
的真正释放是随着函数调用的结束而消失)。
delete ptr;
后ptr
成了"空悬指针",即指向一块曾经保存数据对象但现在已经无效的内存的指针。此时,ptr
会在在内存里乱指一通,有可能指到一些重要地址造成出错,因此为了使用的安全,我们一般在delete ptr
之后还会加上ptr = nullptr;
这一语句使其不指向任何对象。
#include<iostream>
#include<memory>
using namespace std;
int main() {
int* ptr = new int(100);
cout << *ptr << endl;//ptr指向的对象
cout << ptr << endl;//ptr指向对象地址
cout << &ptr << endl;//ptr地址
delete ptr;
cout << &ptr << endl;//delete后ptr地址不变
cout << ptr << endl;//delete后ptr指向地址变随机
return 0;
}
程序运行结果:
小白学习记录,如有理解错误欢迎大佬斧正,感激不尽!