匿名对象【类和对象(终)】AND 【内存管理】

P. S.:以下代码均在VS2022环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

在这里插入图片描述
                                           博主主页: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++在内存中的区域划分。

  1. 内核空间:一般存放的为系统执行文件,即当开机启动是,计算机会从内核空间内调用其系统的执行文件,从而进行一系列开机操作,并不是说当电脑联通电源后,就会自动开机,其中也包括了从内核空间内调用系统执行文件的工作。
  2. 栈:栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。
  3. 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
    创建共享共享内存,做进程间通信。
  4. 堆用于程序运行时动态内存分配,堆是可以上增长的。
  5. 数据段–存储全局数据和静态数据。
  6. 代码段–可执行的代码/只读常量。



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的原理:
    1. 调用operator new函数申请空间
    2. 在申请的空间上执行构造函数,完成对象的构造
  • delete的原理
    1. 在空间上执行析构函数,完成对象中资源的清理工作
    2. 调用operator delete函数释放对象的空间
  • new T[N]的原理
    1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对
      象空间的申请
    2. 在申请的空间上执行N次构造函数
  • delete[]的原理
    1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
    2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释
      放空间




4、结语


在这里插入图片描述

  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值