版权声明:对于本博客所有原创文章,允许个人、教育和非商业目的使用,但务必保证文章的完整性且不作任何修改地以超链接形式注明原始作者、出处及本声明。
博客地址:http://blog.csdn.net/shuxiao9058
原始作者:季亚
shared_ptr包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针,可以被地拷贝和赋值(包括流对象std::ifstream),在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。shared_ptr也可以安全地放到标准容器中,并弥补了auto_ptr因为转移语义而不能把指针作为STL容器元素的缺陷。(摘自《Boost程序库完全开发指南:深入C++“准”标准库(修订版)》 p.69)
下面是一个shared_ptr对流对象操作的一个例子:
#include <iostream>
#include <fstream>
#include <string>
#include <boost/shared_ptr.hpp>
struct demo_class
{
public:
demo_class( boost::shared_ptr<std::ifstream> sp ) {
m_sp = sp; // 将其赋给成员m_sp
std::cout << "ctor: ";
std::cout << m_sp.use_count() << std::endl;
}
~demo_class() {
std::cout << "dtor: ";
std::cout << m_sp.use_count() << std::endl;
}
public:
void Read( )
{
char line[100] = {0};
std::cout << "----------------------------------优美的分隔线----------------------------------"
<< std::endl;
while( m_sp->getline( line, 100 ) )
{
std::cout << line << std::endl;
}
std::cout << "----------------------------------优美的分隔线----------------------------------"
<< std::endl;
}
private:
boost::shared_ptr<std::ifstream> m_sp;
};
int main( int argc, char **argv )
{
if ( argc != 2 )
{
return -1;
}
std::string filename( argv[1] );
std::ifstream in( filename, std::ios::in ) ;
boost::shared_ptr<std::ifstream> sp( new std::ifstream( filename ) );
std::cout << "sp.use_count(): " << sp.use_count() << std::endl;
demo_class *dc = new demo_class( sp );
dc->Read();
std::cout << "before dtor: " << sp.use_count() << std::endl;
delete dc; // 删除demo_class对象,调用析构函数
std::cout << "after dtor: " << sp.use_count() << std::endl;
}
运行结果如图所示:
图1 运行结果
备注:通过使用文件流指针(如std::ifstream *ifpFStream)一样可以在不同函数之间进行传递,而且更容易理解,只不过不要忘记销毁该文件流对象。