瓦解C++标准库几大难点

在C++标准库中,有关缺省变量值的限制非常模糊。基于此,很多编译器允许开发人员将缺省变量值包含在函数声明,指向函数的指针和引用,成员函数的指针,以及typedef声明中。

成都创新互联主营温泉网站建设的网络公司,主营网站建设方案,app软件开发公司,温泉h5微信小程序搭建,温泉网站营销推广欢迎温泉等地区企业咨询

例外一种需要更好的内存控制的情况是:需要在有限资源的情况下长时间不间断运行的程序。实时系统经常需要用最少的耗费来获取有保证的可预期的内存。这也就导致了更好的内存控制的需要。#t#

一般来说,这些程序都避免使用动态的内存分配,而使用特殊目的的内存分配器来管理有限资源。此外,还有一些情况下由于硬件或系统的要求,需要将对象放在指定的内存位置。这也需要进行定制的内存管理(通过重载new来加以实现)。

当分配内建(built-in)类型的对象、未包含用户自定义的new操作符函数的类对象、任何类型的数组时,使用全局new操作符函数。当在类中自定义C++标准库,分配该类对象的内存时,调用该类的new操作符。如下:

 
 
 
  1. #include  
  2. #include  
  3. class Blanks  
  4. {  
  5. public:  
  6. Blanks(){}  
  7. void *operator new( size_t stAllocateBlock, char chInit );  
  8. };  
  9. void *Blanks::operator new( size_t stAllocateBlock, char chInit )  
  10. {  
  11. void *pvTemp = malloc( stAllocateBlock );  
  12. if( pvTemp != 0 )  
  13. memset( pvTemp, chInit, stAllocateBlock );  
  14. return pvTemp;  
  15. }  
  16. int main()  
  17. {  
  18. Blanks *a5 = new( 0xa5 ) Blanks;//创建对象Blanks,并且初试化为0xa5  
  19. return a5 != 0;  

new操作符可以重载,而delete却不行。因为等到需要释放的时候,我们所能得到的就是一个指针。而且该指针可能不是原先的对象类型指针(有可能进行了类型转换)。实际上,当使用new获得一个指向一片内存的指针时,在该片内存前有一个指示器(indicator),记录实际分配的内存数量。当调用delete时,可以获知需要释放的内存大小。数组的释放(Deallocating Arrays):

 
 
 
  1.  void f( )  
  2. {  
  3. X* p1 = new X[10];  
  4. //...  
  5. delete [] X;  

为什么不使用delete [10] X;来释放内存?Bjarne Stroustrup称这种做法容易导致错误,而将记录元素个数的任务放在delete的实现中了。至于为什么C++中未内建垃圾收集器(Garbage Collection)的原因,看《C++语言的设计和演化》(En) Bjarne Stroustrup 机械工业出版社(俗称:D&E)可以得到答案。

此外,C++标准库中提供了一种智能型指针auto_ptr,这种指针可以帮助我们防止“被异常抛出时发生资源泄漏”。但是缺点是该智能型指针不能指向数组,因为其内部释放内存是通过delete而非delete [] 来进行的。

所以,只能使用其来指向一个单个对象。模板部分是C++中比较难的部分,也是C++的魅力所在。以下文字是我以前看过的,具体出处不清楚了。今天稍微整理了一下,作为模板介绍的一个单元。

网站题目:瓦解C++标准库几大难点
URL网址:http://www.mswzjz.cn/qtweb/news39/227789.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能