今日学习:C++内存管理,mysql事务的四种隔离级别

一、C++的内存管理

(一) 在C++ 中,内存分成5个区:堆、栈、自由存储区、全局/静态变量存储区和常量存储区。

1.栈
用来存储函数调用时的临时信息,如函数调用所传递的参数、函数的返回地址、函数的局部变量等。 在程序运行时由编译器在需要的时候分配,在不需要的时候自动清除。栈内存的申请和释放遵循LIFO(先进后出)。
2.堆
由程序员手动分配的内存,用malloc申请,free释放。
3.自由存储区
由new和delete管理的内存,与堆不尽相同。
4.全局/静态存储区
存放全局变量和静态变量。
5.常量存储区
存放常量,不允许修改。

void fun1(){
	int *p=new int[5];
}

上面代码的意思是,在栈区申请了一块内存存放指针,指向在自由存储区申请的一个数组。

(二)堆与栈的区别

1.分配和管理方式不同
堆是动态分配的,其空间的分配和释放都由程序员控制。
栈由编译器自动管理。栈有两种分配方式:静态分配和动态分配。静态分配由编译器完成,比如局部变量的分配。动态分配由_alloca()函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配是由编译器进行释放,无须手工控制。
2.产生碎片不同
对堆来说,频繁的new/delete或者malloc/free可能会造成内存空间的不连续,造成大量的碎片,使程序效率降低。
对栈而言,则不存在碎片问题,因为栈是先进后出的队列,永远不可能有一个内存块从栈中间弹出。
3.增长方向不同
堆由低地址向高地址增长。
栈由高地址向低地址增长

(三)内存使用错误

1.内存未初始化就使用
2.操作越界
3.忘记释放内存,内存泄漏
4.内存已经释放,却仍在使用:

  • 不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。
  • 内存释放后指针没有指向nullptr,产生野指针。

(四)如何定位内存泄漏

内存泄露的位置
内存泄漏及解决办法

二、事务的四种隔离级别

1.read uncommitted; 读未提交的

a事务对数据操作,操作过程中,事务没有被提交,但是b可以看见a操作得结果。
**容易造成脏读:**一个事务读取到了另一个事务还没有提交的数据,就叫做脏读。

2.read committed ; 读已经提交的

容易造成不可重复读(暂时不太理解)

3.repeatable read; 可重复读

容易造成幻读
事务a和事务b,同时操作一张表,事务a提交的数据,不能被事务b读到,这就造成了幻读。
事务a对数据做出了修改,然后commit,但此时事务b并不能读到修改的数据,拿插入来说,此时事务b如果插入相同的数据,会报错。即,事务b当前并没有此数据,但是却不能插入,彷佛发生了幻觉一样。

4.serializable 串行化

两个事务同时操作一张表,只有当一个事务操作完毕并且commit之后,另一个事务才能继续写数据,否则sql语句会卡住,进入排队状态(串行化)。
性能比较差

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值