Effective C++ 条款八 了解各种不同意义的new与delete

我们常见的 new运算符
用起来大概是这样的:
Class A{
    A(){......;}
};

A* ptr = new A;

上面这种new其实可以分解为两步:
1.分配内存
2.在该段内存上执行A的构造函数
如下所示:
void * memory = operator new(sizeof(string));        //分配内存
call string:: string("Memory Management") on *memory;    //在分配好的内存上调用构造函数
string* ps = static_cast<string*>(memory);        //将其由void强制转换为想要的类型

C++新标准中,我们虽然不能够改变new,但是可以改变这个“operator new”,即如何分配内存:比如在刚刚分配内存后还没调用构造函数的时候就给这片内存一个初值之类的操作。
我们就可以这样调用
void *rawMemory = operator new(sizeof(string));
同时,一旦我们重载了operator new,那么我们在进行动态变量创建(即使用new运算符进行变量创建时),在分配内存阶段,编译器会调用我们所重载的那个内存分配函数,而不是原始的那种。。。


另一个需要注意的时Placement new,即在一块已知的内存上去调用构造函数构建对象,而不是使用传统的new方法先分配内存(此时内存的地址时系统分配的,我们不造)再调用构造函数。
用Placement new的好处是,如果我们的对象被要求必须位于特定的地址,或者是置于以特殊函数分配出来的内存上的话,我们必须先手工分配一块我们期望的内存,然后调用Placement new在这块内存上构建对象

用法如下:
Class Widget{
public:
    Widget(int widgetSize);
};

Widget * constructWidgetInBuffer(void* buffer, int widgetSize)
{
    return new (buffer) Widget(widgetSize);        
    /*
    如果去掉(buffer),就和原始的 new Widget(widget)没什么区别了
    加上(buffer)之后,new operator会隐式的调用我们的buffer,而不是由系统自动分配新内存的地址。
        */
}

总结:
1.如果你希望在堆上创建对象,最好使用new operator(即原生的new),它不但分配内存而且为该对象调用一个constructor;
  此种情况下,若要进行收尾工作,则可直接调用 delete 操作符(我们常见的delete),它首先会析构掉对象,然后释放掉内存
2.如果你只打算分配一块内存,那么最好调用operator new,它会返回一个指向所分配内存区域的指针。
  此种情况下,若要进行收尾工作,则需要调用operator delete,这样会收回由operator new分配的内存,而不会调任何类的析构函数
3.如果你打算在堆上创建内存时自己决定内存分配方式,那么你需最好写一个自己的operator new版本,并使用new operator(即我们常说的new),它会自动调用你所写的operator new来分配内存。
  此种情况下,若要进行收尾工作,则直接调用原生的delete
4.如果你打算在已分配的一段内存里构建对象,那么就是用placement new,将指向该段内存的指针以void*的类型,以new (ptr) A();的形式建构对象,这将会在ptr所指向的内存区域调用A();
  此种情况下,若要进行收尾工作,则只需要调用析构函数就好,不能调用任何释放内存的操作数(因为这里ptr所指向的内存不归收尾工作管,那片内存在placement new之前就已经存在了)

总结:
在动态分配数组的情况下会稍微复杂些。对应的操作符为operator new[] 与 operator delete[],这里不详细展开。

总之,new operator 和 delete operator都是内建操作符,无法为你所控制,但是它们所调用的内存分配/释放函数则不然。当你向要定制new operator和delete operator的行为,记住,你其实无法真正办到。
你可以修改它们完成任务的方式(如指定初始内存的值),至于它们的任务,已经被C++语言规范固定死了。

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值