介绍operator new、operator delete函数

目录  :

1.回顾new、delete操作符

                     1.new、delete用法

                     2.new、delete对自定义类型数据的处理

2.new、delete底层原理

                      1.引出opereator new、opereator delete函数

                      2.opereator new、opereator delete用法

                      3.operator new、opereator delete功能

3.定位new(了解)

                     1.定位new的用法、及场景

4.内存泄露问题

                       1.内存泄露的原因

                       2.内存泄露的危害

                       3.内存泄露的实例

---------------------------------------------------------------------------------------------------------------------------------

  回顾new、delete操作符              

1.new、delete用法

开辟一个整形大小的空间,和销毁

那么我们开辟10个整形大小的空间,和销毁

2.对自定义类型都做了哪些处理

class Stack
{
public:
	Stack(int capacity = 4)
		:_capacity(capacity)
		,_top(0)
	{
		_a = new int[capacity];
	}
	~Stack()
	{
		delete[] _a;
		_capacity = _top = 0;
		_a = nullptr;
	}
private:
	int* _a;
	int _top;
	int _capacity;
};

int main()
{
	Stack* pst2 = new Stack;  

	delete pst2;     

	return 0;
}

我们可以知道new、delete对自定义类型数据开辟空间时:

new调用了构造函数+开空间

delete调用了析构函数(内部资源进行清理)+释放空间

-------------------------------------------------------------------------------------------------------------------------------

2.new、delete底层原理

1.引出opereator new、opereator delete函数

在执行到new时跳到反汇编看看

 call一条指令,调用了operator new这个函数

我们在看看执行到delete时,跳到反汇编

 红色方括号里的我们可以直接当成 是operator delete函数的调用

那么我们通过上面得到,new、delete的底层 都是通过调用 operator new函数和operator delete函数来申请空间和释放空间

 2.operator new 、operator delete用法

operator new的用法和malloc的用法一致

operator delete 的用法

 3.operator new 、operator delete 功能

C面向过程发生错误处理的方式----置为空指针

C++面向对象发生错误的处理方式 ----抛异常

 那么new抛出的异常来源于 operator new 抛出的

 operator new 、operator delete 总结:

1.operator new、operator delete就是对malloc和free的封装

2.operator new中调用malloc开辟空间失败后,改为抛异常处理,这种处理更符合C++处理错误的方式

----------------------------------------------------------------------------------------------------------------------------

3.定位new

定位new  ----- 实质就是手动调用构造函数(构造函数是不能显示调用的,析构函数可以)

定位new的用法    new(空间地址)数据类型

 

 调用定位new时我们也可以对A进行传参

注意的是

 总结定位new:

1.已分配的内存空间中调用构造函数对象进行初始化

---------------------------------------------------------------------------------------------------------------------------------

4.内存泄露

    1.内存泄露的原因  ?

              1.动态申请的内存,不使用了,有没有主动释放,就存在内存泄露

   2.内存泄露的危害    ?

              1.出现内存泄露的进程正常结束,进程结束时这些内存会还给操作系统,危害较小

              2.出现内存泄露的进程非正常结束,比如僵尸进程

              3.需要长期运行的程序,出现内存泄露,危害很大,很可能导致宕机

   3.内存泄露的实例

 

异常安全问题

---------------------------------------------------------------------------------------------------------------------------------

这是我写的第十六篇博客,相比于前面的博客在排版,内容方面有了更大的进步。

希望越来越好,大家一起共同努力,朝着自己的目标前进

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值