【C++内存管理-从平地起到万丈高楼】part1-primitives-基础工具

1.C++程序的内存分配

 

2.C++ memory primitives-内存分配手段

3.内存分配示例

(1)_MSC_VER_下的allocate有两个参数,第二个参数没有默认值,所以要显示给出.
(2)_BORLANDC_下的allocate有两个参数,第二个参数有默认值,所以可以不显示给出.
(3)_GNUC_在2.9版本的时候用的alloc::allocate(512),之后不知道哪个版本开始用和
和_MSC_VER_和_BORLANDC_一样的allocate<int>().allocate(512),将alloc::allocate(512)
演变成一个__gnu_cxx::pool_alloc<int>().allocate(9);

第一章图片中的__GNUC__中的接口是早些的2.9版本的,
第一章图片中的__GNUC__中的接口是4.9版本的.


pool_alloc--内存池
实际上GNUC下有七八个内存分配器,我们可以在合适的场景下用高效的那个.

4.new expression(new表达式)

 

pc->Complex::Complex(1,2);--又惊又喜之后又沮丧,这个在VC6.0上程序员可以写,但是在有些平台上不
可以.VC6.0下可以也许可以算作不严谨吧,不可以这么做的话,可以用placement new来做.
即:new(p)Complex(1,2);关于placement new后序可有更详细说明,此处略过.

图片右上角的中对malloc做了处理,一般情况下malloc不会出错,但是当内存耗尽,没有内存可用的时候就
会报错,_callnewh(size)是一种可以自己设定的函数,如果malloc失败,就会调用设定的这个函数,这个函
数里可以写一些认为可以释放的内存,下一次再调用的时候就可以成功.这个是C++设置的一种机制.

void *operator new(size_t size,const std::nothrow_t&_THROW)
第二个参数表示不抛异常.

老师图片中写的otor是constructor的缩写吗?反正意思应该是构造函数的意思. 


总结一下:
new一个对象,实际上要去申请一块内存,并且将对象初始化.

图中的operate new这个函数其实就是封装了malloc的,两者功能几乎类似.

5.delete expression(delete表达式)

 

6.Ctor&Dtor直接调用(Constructor和Destructor的直接调用-构造与析构函数的直接调用) 

7.array new & array delete

需要注意在用array new来初始化一系列对象的时候需要有默认的构造函数,
其次系统在给简单类型和自定义复杂类型的对象分配内存的时候的空间分布是不一样的.

 

8.replacement new-定点new

 

9.C++申请分配内存时的函数调用顺序

类的内存分配/回收函数(可重载):
ClassName::operator new(size_t);
ClassName::operator delete(size_t);

全局的内存分配/回收函数(可重载但少见,影响太大):
::operator new(size_t);
::operator delete(size_t);



如果重载了类的内存分配函数:
(1)Foo* p = new Foo(x);
(2)Foo::operator new(size_t);
(3)::operator new(size_t);
(4)malloc(size_t);
疑问:老师说(3)个也会调用,我的类中重载了分配函数之后,还要调用全局的吗?不会覆盖全局函数吗?
      不理解.

 

 

 

10.全局的内存分配/回收函数重载-影响无远弗届-慎用

没文化读不懂老师的字,哈哈
无远佛届:指不管多远之处,没有不到的.

“无远佛届”出自《尚b书·大禹谟》
原文是:益赞于禹曰:惟德动天,无远弗届;满招损,谦受益,时乃天道。
意思是:益为帮助禹征讨苗人说,只有修德能感动上天,那是没有远而不至的(就是说没有它达不到
的);自满招来损害,谦虚受到益处,这是天的常道。益:舜的臣子。赞:这里是助的意思。

 

11. 类中重载new和delete操作符

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值