tips
2019-01-26 本文已影响0人
未来已来_1cab
两个常被使用的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类,它们都提供你要的行为。