手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

控制C 的内存分配

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
  在嵌入式系统中使用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[]操作符中的个数参数是数组的大小加上额外的存储对象数目的一些字节。在您的内存分配机制重要考虑的这一点。您应该尽量避免分配对象数组,从而使您的内存分配策略简单。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS