博主主页:LiUEEEEE
C++专栏
C语言专栏
数据结构专栏
排序算法专栏
力扣牛客经典题目专栏
目录
1、匿名对象
C++中的匿名对象有些类似于C语言中的匿名结构体类型,即在初始化时不给予类对象名称,且其作用域较小,其生命周期仅限于代码所在行,例如:
class Solution {
class Sum
{
public:
Sum()
{
_ret += _i;
_i++;
}
};
static int _i;
static int _ret;
public:
int Sum_Solution(int n) {
Sum arr[n];
return _ret;
}
};
int Solution::_i = 1;
int Solution::_ret = 0;
int main()
{
cout << Solution().Sum_Solution(10) << endl;
return 0;
}
如上述代码块所示,当我们不通过加减乘除来进行前n个数字相加的结果时,我们可以通过创建匿名结构体来进行计算,此时可以省去很多繁琐的步骤,当 Solution().Sum_Solution(10) 执行完毕后,边会调用其析构函数进行析构。
2、内存管理
因C++是对C语言的进一步完善,所以C++也会兼容C,故本文中的内存管理,是在C++的层次进行讲解,但也同样适用于C语言。
上图所示是C和C++在内存中的区域划分。
- 内核空间:一般存放的为系统执行文件,即当开机启动是,计算机会从内核空间内调用其系统的执行文件,从而进行一系列开机操作,并不是说当电脑联通电源后,就会自动开机,其中也包括了从内核空间内调用系统执行文件的工作。
- 栈:栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。
- 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
创建共享共享内存,做进程间通信。 - 堆用于程序运行时动态内存分配,堆是可以上增长的。
- 数据段–存储全局数据和静态数据。
- 代码段–可执行的代码/只读常量。
3、C++中的内存管理方式
在C语言中,我们申请内存空间和释放空间通常使用的都是,“ malloc ” “ calloc ” “ realloc ” “ free ” 等,但其使用起来有些许繁琐,例如需要使用者手动输入类型,大小等,故C++在此基础上创建了新的内存申请和释放方式,即 “ new ” “ delete ”。
3.1 new 和 delete 操作内置类型
其操作方法如下:
void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}
注意:
- 注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用
new[ ]和delete[ ],匹配起来使用。
3.1 new 和 delete 操作自定义类型
其操作方法如下:
class A
{
public:
A(int a = 0)
: _a(a)
{
cout << "A():" << this << endl;
}
~A()
{
cout << "~A():" << this << endl;
}
private:
int _a;
};
int main()
{
// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间
//还会调用构造函数和析构函数
A* p1 = (A*)malloc(sizeof(A));
A* p2 = new A(1);
free(p1);
delete p2;
// 内置类型是几乎是一样的
int* p3 = (int*)malloc(sizeof(int)); // C
int* p4 = new int;
free(p3);
delete p4;
A* p5 = (A*)malloc(sizeof(A)*10);
A* p6 = new A[10];
free(p5);
delete[] p6;
return 0;
}
3.1 new 和 delete 的实现原理
C++中的new 和 delete 在本质上是对C语言中的 malloc 和 free 进行了重新封装,其底层逻辑依旧是 malloc 和 free,只不过是在调用的时候有些许区别。
对于内置类型:new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。
对于自定义类型:
- new的原理:
- 调用operator new函数申请空间
- 在申请的空间上执行构造函数,完成对象的构造
- delete的原理
- 在空间上执行析构函数,完成对象中资源的清理工作
- 调用operator delete函数释放对象的空间
- new T[N]的原理
- 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对
象空间的申请 - 在申请的空间上执行N次构造函数
- 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对
- delete[]的原理
- 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
- 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释
放空间
4、结语
十分感谢您观看我的原创文章。
本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
如需引用,注明地址。