tips

两个常被使用的RAII classes分别是std::tr1::shared_ptr和std::auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null。

auto_ptr和tr1::shared_ptr两者都在其析构函数内做delete而不是delete []动作。那意味在动态分配而得的array身上使用auto_ptr或tr1::shared_ptr是个馊主意。尽管如此,那么做仍能通过编译:

//馊主意!以下两个智能指针都使用了错误的delete形式。
std::auto_ptr<std::string> aps(new std::string[10])
std::tr1::shared_ptr<int> spi(new int[1024])

你或许会惊讶地发现,并没有特别针对“C++动态分配数组”而设计的类似auto_ptr或tr1::shared_ptr那样的东西,甚至TR1中也没有。那是因为vector和string几乎总是可以取代动态分配而得的数组。如果你还是认为拥有针对数组而设计、类似auto_ptr和tr1::shared_ptr那样的classes较好,看看Boost吧(见条款55)。在那儿你会很高兴地发现boost::scoped_array和boost::shared_array类,它们都提供你要的行为。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容