一、C++内存管理方式简介
C语言中的内存管理方式在C++中可以继续使用,但是在有些地方就无能为力,而且使用起来比较麻烦。因此C++中引入了自己的内存管理方式,通过new和delete操作符进行动态内存管理。
二、new语法
new可以申请1个或多个空间,且可以为这些空间初始化(未初始化的空间默认为0)
cpp
int* ptr1 = new int;//申请一个int大小空间,默认初始化为0
int* ptr2 = new int[10];//申请10个int大小空间,默认初始化为0
int* ptr3 = new int(1);//申请一个int大小空间,初始化为1
int* ptr4 = new int[10] {1, 2, 3, 4, 5};//申请10个int大小空间,前5个空间初始化为1,2,3,4,5,后5个默认初始化为0
new申请空间无需手动检查是否失败,因为new申请空间失败后会抛异常
cpp
void func()
{
int n = 1;
while (1)
{
int* ptr = new int[1024 * 1024 * 100];
cout << n << "->" << ptr << endl;
++n;
}
}
int main()
{
func();
//捕获异常
try
{
func();
}
catch (const exception& e)
{
cout << e.what() << endl;
}
return 0;
}
三、delete语法
delete在释放空间时,对于一次申请多个空间的需要带上[ ]
cpp
delete ptr1;
delete[] ptr2;
delete ptr3;
delete[] ptr4;
四、链表结点实例代码
new自定义类型空间时,编译器会自动调用该自定义类型的构造函数
cpp
struct ListNode {
struct ListNode* _next;
int _val;
//构造函数
ListNode(int val)
:_next(nullptr)
,_val(val)
{}
};
//构建链表
ListNode* CreateList(int n)
{
ListNode head(-1);//哨兵位
ListNode* tail = &head;
int val;
cout << "请依次输入" << n << "个结点值" << endl;
for (size_t i = 0; i < n; i++)
{
cin >> val;
tail->_next = new ListNode(val);
tail = tail->_next;
}
return head._next;
}