当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

C++中new和delete招致的内存分配问题详解[VC/C++编程]

赞助商链接



  本文“C++中new和delete招致的内存分配问题详解[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

在嵌入式系统中利用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);
  // .. other members here ...
};
void *TestClass::operator new(size_t size)
{
 void *p = malloc(size); // Replace this with alternative allocator
 return (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];
 // ... etc ...
 delete[ ] p;
}

但是注意:关于大都C++的实现,new[]操作符中的个数参数是数组的大小加上额外的存储对象数目的一些字节.在你的内存分配机制重要考虑的这一点.你应当尽大概避免分配对象数组,从而使你的内存分配战略简单.


  以上是“C++中new和delete招致的内存分配问题详解[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Windows 7中UAC中的蓝黄提醒框
  • 浅析数据源在JDBC中的操纵
  • Weblogic中因为IP变更招致SubCoordinator not available,Transa
  • 关于在weblogic中异步伐用webservice
  • Weblogic中的load banlance问题
  • 关于weblogic中操纵Dom4j、Xerces招致实施线程挂起的问题
  • JVM TI学习(1) 若何中止weblogic中stuck thread
  • Weblogic中几个internal的XA timeout(情况切换相关的超时)
  • 如安在基于注解气势的Spring-MVC中操纵阻碍器
  • 关于weblogic中jms message的情况
  • 关于Weblogic中XAER_NOTA XAException的两种注释
  • 关于weblogic中操纵prepared statement cache后操作DDL的问题
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .