(注:本文是针对上篇文章中C++内存管理的两个关键字)两个关键字原理的解析,对于这两个关键字的使用并没有什么影响,如果只想得知两个关键字的使用方法,则可以直接跳过本篇文章)
目录
2.operator new 与 operator delete:
2.2 为什么要引入operator new和operator delete:
1. 引入:
为了方便说明两个关键字的实现原理,首先引入一个简单的栈,具体代码如下:
#include<iostream>
using namespace std;
class Stack
{
public:
Stack(int capacity = 4)
{
cout << "Stack( int capacity = 4)" << endl;
_a = new int[capacity];
_capacity = capacity;
_top = _capacity;
}
~Stack()
{
cout << "~Stack()" << endl;
delete[]_a;
_a = nullptr;
_top = 0;
_capacity = 0;
}
private:
int* _a;
int _top;
int _capacity;
};
int main()
{
Stack s1;
return 0;
}
运行代码,结果显示调用了一次构造函数和一次析构函数:
对于下方给出的代码,即:
Stack* s2 = new Stack;
delete s2;
整体的运行顺序为:利用关键字开辟一个类型为自定义类型
的空间,大小为
字节。此后,由自定义类型的构造函数可知,再利用关键字
为指针变量_
开辟空间。因此,第一行代码整体开辟了两次空间。第一次是
自身开辟空间,第二次是
针对自定义类型会去调用自定义类型的构造函数,在构造函数中,再开辟一次空间。
对于第二行代码中的关键字。首先需要调用析构函数,析构函数的作用并非像
一样释放掉开辟的空间,而是释放掉空间中的资源,也就是指针变量_
指向的空间。在调用完析构函数后,再去释放空间。此处可以看出来,针对自定义类型,在释放空间时,并不能区调用
。因为
并不会处理指针变量_
中已经开辟的空间。因此会导致内存泄漏。
由上面的例子和上篇文章引入关键字使用方法的例子可以了解,针对内置类型与