网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.偶写的链表、堆栈、队列的集合操.
.怎样启动一个程序而不显示它.
.switch语句的“不准遍历”.
.PE文件格式详解(4).
.C++习题与解析-引用.
.C++中通过溢出覆盖虚函数指针列表.
.COM Interop 理论与实践.
.C++箴言:考虑可选的虚拟函数的替.
.下面的源码中搬掉僵尸.
.模仿szk的tbf制作工具.
.明晰C++内存分配的五种方法的区别.
.学习C++的最大难度是什么?.
.C++箴言:考虑支持不抛异常的swap.
.WinHelp API命令方法.
.String类的一些赋值语句.
.使用ASP.NET Atlas开发检测密码强.
.C语言高效编程的的四大绝招.
.浅薄与偏见 驳“C语言已经死了”.
.C/C++编程新手错误语录(续二).
.让C/C++图形程序独立运行.

控制C++的内存分配

发表日期:2008-3-8



  在嵌入式系统中使用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[]操作符中的个数参数是数组的大小加上额外的存储对象数目的一些字节。在你的内存分配机制重要考虑的这一点。你应该尽量避免分配对象数组,从而使你的内存分配策略简单。
上一篇:Processes (进程) 人气:753
下一篇:在DBGrid中实现Copy、Paste功能 人气:503
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐