我辈岂是蓬蒿人!

C++ && keyWordSpotting

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  11 Posts :: 0 Stories :: 4 Comments :: 0 Trackbacks

常用链接

留言簿(9)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 6930
  • 排名 - 1377

最新评论

阅读排行榜

评论排行榜

  
   动态分配的对象:程序员完全控制分配与释放,分配在程序的空闲存储区(free store)的可用内存池中。
 
 1
)单个对象的动态分配与释放;
 new
表达式没有返回实际分配的对象,而是返回指向该对象的指针。对该对象的全部操作都要通过这个指针间接完成。
 
随机分配的内存具有随机的位模式,建议初始化,例如:

 int* pi = new int(0);


 

空闲存储区是有限的资源,若被耗尽,new表达式会失败,抛出bad_alloc异常。
 
这样做没有必要:

     if  ( pi != 0 )
        delete pi;

  说明:如果指针操作数被设置为0,则C++保证delete表达式不会调用操作符delete()。所以没有必要测试其是否为0
 
delete表达式之后,pi被称作空悬指针,即指向无效内存的指针。空悬指针是程序错误的根源,建议对象释放后,将该指针设置为0
 
 2
auto_ptr
 auto_ptr
C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象,但是,它没有对数组管理提供类似支持。它的头文件为:
 

    #include  < memory >  

  auto_ptr对象的生命期结束时,动态分配的对象被自动释放。
 auto_ptr
类模板背后的主要动机是支持与普通指针类型相同的语法,但是为auto_ptr对象所指对象的释放提供自动管理。例:

     //  第一种初始化形式
    std::auto_ptr< int > pi(  new   int (1024) );     // 

 auto_ptr 类模板支持所有权概念,当一个auto_ptr对象被用另一个auto_ptr对象初始化赋值时,左边被赋值或初始化的对象就拥有了空闲存储区内底层对象的所有权,而右边的auto_ptr对象则撤消所有责任。例:

    std::auto_ptr<std:: string > pstr_auto(  new  std:: string ( "Brontonsaurus" ) );
    
// 
第二种初始化形式
    std::auto_ptr<std:: string > pstr_auto2( pstr_auto );

  判断是否指向一个对象,例:

     //  第三种初始化形式
    auto_ptr < int >  p_auto_int;    
    
if  ( p_auto_int. get ()  ==   0  )
        
    
else
        
//  重置底层指针,必须使用此函数        
        p_auto_int.reset(  new   int 1024  ) );


 3)数组的动态分配与释放
 
建议使用C++标准库string,避免使用C风格字符串数组。
 
为避免动态分配数组的内存管理带来的问题,一般建议使用标准库vectorliststring容器类型。
 
 4
)常量对象的动态分配与释放
 
可以使用new表达式在空闲存储区内创建一个const对象,例:

     //  此时必须初始化,否则编译错误
     const   int * pci =  new   const   int (1024);    

  我们不能在空闲存储区创建内置类型元素的const数组,原因是:我们不能初始化用new表达式创建的内置类型数组的元素。例:

     const   int * pci =  new   const   int [100];  //  编译错误


 5
)定位new表达式
 new
表达式的第三种形式允许程序员要求将对象创建在已经被分配好的内存中。称为:定位new表达式(placement new expression)。程序员在new表达式中指定待创建对象所在的内存地址。如下所示:
 new
place_address) type-specifier
 
注意:place_address必须是个指针,必须包含头文件<new>。这项设施允许程序员预分配大量的内存,供以后通过这种形式的new表达式创建对象。例如:

    #include  < iostream >
    #include 
< new >      //  必须包含这个头文件
    
    
const   int  chunk  =   16 ;
    
class  Foo
    
{
        
    }
;
    
    
char *  buf  =   new   char sizeof (Foo)  *  chunk ];
    
    
int  main( int  argc,  char *  argv[])
    
{
        
//  只有这种形式的创建,没有配对形式的delete 
        Foo *  pb  =   new  (buf) Foo;
                
        delete[] buff;
        
        
return   0 ;
    }

posted on 2006-08-22 14:54 keyws 阅读(580) 评论(3)  编辑 收藏 引用 所属分类: 读书笔记

Feedback

# re: 【note】《C++ Primer - 8.4节“动态分配的对象”》学习笔记 2006-09-22 13:22 feifei
有没有--编译过无误的《C++ Primer >>第三版源代码?---帮下偶
l  回复  更多评论
  

# re: 【note】《C++ Primer - 8.4节“动态分配的对象”》学习笔记 2006-09-24 14:11 keyws
@feifei
还真的没有,我看《C++ primer》时,感兴趣的就自己敲一下,也没有刻意去找现成的源代码。
  回复  更多评论
  

# 提个建议 2008-12-22 07:57 云川
{
// 只有这种形式的创建,没有配对形式的delete
Foo * pb = new (buf) Foo;
//因为没有配对形式的delete 所以要显式的调用对象的析构函数
//否则在存储池析构以后调用对象会出错(此时系统并不认为对象已析构)
pb->~Foo();
delete[] buff;

return 0 ;
}   回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理