问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何重载new和delete函数(转)

发布网友 发布时间:2022-04-08 09:37

我来回答

1个回答

热心网友 时间:2022-04-08 11:07

在嵌入式系统中使用C++的一个常见问题是内存分配,即对new 和 delete 操作符的失控。 具有讽刺意味的是,问题的根源却是C++对内存的管理非常的容易而且安全。具体地说,当一个对象被消除时,它的析构函数能够安全的释放所分配的内存。 这当然是个好事情,但是这种使用的简单性使得程序员们过度使用new 和 delete,而不注意在嵌入式C++环境中的因果关系。并且,在嵌入式系统中,由于内存的*,频繁的动态分配不定大小的内存会引起很大的问题以及堆破碎的风险。 作为忠告,保守的使用内存分配是嵌入式环境中的第一原则。 但当你必须要使用new 和delete时,你不得不控制C++中的内存分配。你需要用一个全局的new 和delete来代替系统的内存分配符,并且一个类一个类的重载new 和delete。 一个防止堆破碎的通用方法是从不同固定大小的内存持中分配不同类型的对象。对每个类重载new 和delete就提供了这样的控制。 重载全局的new 和delete 操作符 可以很容易地重载new 和 delete 操作符,如下所示:void * operator new(size_t size){void *p = malloc(size);return (p);}void operator delete(void *p);{free(p);} 这段代码可以代替默认的操作符来满足内存分配的请求。出于解释C++的目的,我们也可以直接调用malloc() 和free()。也可以对单个类的new 和 delete 操作符重载。这是你能灵活的控制对象的内存分配。class TestClass {public:void * operator new(size_t size);void operator delete(void *p);};void *TestClass::operator new(size_t size){void *p = malloc(size); // Replace this with alternative allocatorreturn (p);}void TestClass::operator delete(void *p){free(p); // Replace this with alternative de-allocator} 所有TestClass 对象的内存分配都采用这段代码。更进一步,任何从TestClass 继承的类也都采用这一方式,除非它自己也重载了new 和 delete 操作符。通过重载new 和 delete 操作符的方法,你可以自由地采用不同的分配策略,从不同的内存池中分配不同的类对象。 为单个的类重载 new[ ] 和 delete[ ] 必须小心对象数组的分配。你可能希望调用到被你重载过的new 和 delete 操作符,但并不如此。内存的请求被定向到全局的new[ ]和delete[ ] 操作符,而这些内存来自于系统堆。 C++将对象数组的内存分配作为一个单独的操作,而不同于单个对象的内存分配。为了改变这种方式,你同样需要重载new[ ] 和 delete[ ]操作符。class TestClass {public:void * operator new[ ](size_t size);void operator delete[ ](void *p);// .. other members here ..};void *TestClass::operator new[ ](size_t size){void *p = malloc(size);return (p);}void TestClass::operator delete[ ](void *p){free(p);}int main(void){TestClass *p = new TestClass[10];} 但是注意:对于多数C++的实现,new[]操作符中的个数参数是数组的大小加上额外的存储对象数目的一些字节。在你的内存分配机制重要考虑的这一点。你应该尽量避免分配对象数组,从而使你的内存分配策略简单。)评论(0)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
办公软件综合实训图书信息 什么是高分子材料与工程高分子材料与工程介绍 抖音超市普通人怎么入驻 抖音上的超市怎么入驻的 胃胀,有时还有点痛:还嗝气请问吃什么药, ...喝水也吐经常嗝气吃东西就胃胀气经常胃酸有时候胃特别热烧心的感觉... 它是指示代词还是人称代词 指示代词和人称代词语文 汉语指示代词和人称代词区别 长款的牛仔衣如何搭配最出彩? 吸尘器充满电后长期不使用会有什么影响? 用autocad pid2014画好的图纸用autocad2014打不开完全的,设备连线不能显示出来 吸尘器电池使用问题:可以长时间充电吗 小米吸尘器z7plus充电多长时间充满? PIDCAD绘制的图纸可以用CAD打开吗? 绘制PID工艺流程图用什么软件省时,并且软件易学? 小米无线吸尘器充满电后要拔吗? 画pid图要用CAD pid吗,还有什么好的嘛 你好!我现在的工作是化工工程师,感觉现在的工作不知道往哪方面发展的,现在学习CAD想以后进画PID图纸。 吸尘器的电池可充电,但用几分钟后功率降低的原因? 用cadworx怎么绘制pid的单线图 为什么吸尘器充电后用不到两分钟就停了,歇一会就又可以用两分钟,如此反复? 工艺pid是什么,用什么软件画呢 cad的pid插件在哪里 小米家无线吸尘器充电线充电一会儿灯就灭了 本人想画化工图纸,但是在autocad上不知道怎么,据说用pid画的好,有懂得的 pidcad2014如何自定义 autocad2017怎么画p&id图 cad中的pid图? 求大神帮我把自动控制PID图用CAD画出来 自愈水凝胶的自愈水凝胶 - 原理 怎么检测水凝胶中离子浓度 和平精英开什么挂可以吃鸡? 水凝胶吸水后重量先增加再减小是怎么的 吃鸡怎么开挂手机版免费 相分离法制备物理交联水凝胶 绝地求生国际服天服怎么开挂脚本 会玩泰山吃鸡怎么开挂? 和平精英经典模式每一把都吃鸡算不算开挂? 手机可以安装windows10吗 做好的奶油里白醋放多了味道很酸该怎么办 做面包醋放多了怎么办 windows 10 如何下载正版安装 为什么做奶油要放白醋 自制奶油怎么做? 做面包淡奶油加过量怎么办 在家制做奶油为什么要放白醋? 光放大器必须将光信号转换成电信号才可以完成光中继的任务,正确吗? 奶油的做法没有白醋怎么办 做鲜奶油为什么加白醋