首页 / 软件开发 / C++ / 对auto_ptr的学习
对auto_ptr的学习2011-04-06auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象,不过对用new表达式分配的数组管理没有类似的支持,不能用auto_ptr存储数组,如果这样做了,结果将是未定义的.auto_ptr对象被初始化为指向由new表达式创建的动态分配对象.当auto_ptr对象的生命期结束时,动态分配的对象被自动释放.在使用auto_ptr类模板之前,必须包含下面的头文件:#include <memory>auto_ptr对象的定义有下面三种形式: auto_ptr<type_pointed_to> identifier(ptr_allocated_by_new);
auto_ptr<type_pointed_to> identifier(auto_ptr_of_same_type);
auto_ptr<type_pointed_to> identifier;
type_pointed_to代表由new表达式创建的对象的类型.在最常见的情况下,我们希望把auto_ptr直接初始化为new表达式返回的对象地址.可以这样来做:auto_ptr<int> pi(new int(1024);pi被初始化为由new表达式创建的对象的地址,且该对象的初始化值为1024.可以检查auto_ptr所指的对象的值,方式与普通指针相同:if (*pi != 1024);new表达式创建的对象由pi指向,当pi的生命期结束时,它将被自动释放.如果pi是全局对象,则pi所指向的对象在程序结束时释放.如果我们用一个class类型的对象初始化auto_ptr对象,比如标准的string类型,则:auto_ptr<string> pstr_auto(new string("Hello world"));假设现在希望访问一个字符串操作,对于普通的string指针,会按照下面这样来做:string* pstr_type = new string("Hello World");pstr_type->size();那么,用auto_ptr也是一样的方式:auto_ptr<string> pstr_auto(new string("Hello world"));pstr_auto->size();auto_ptr类模板背后的主要动机是支持与普通指针类型相同的语法,但是为auto_ptr对象所指对象的释放提供自动管理.同时,使用auto_ptr对象并不比直接使用指针代价更高.在下面的情况中,用pstr_auto的值初始化pstr_auto2,并且pstr_auto的底层对象是string,会怎样呢?auto_ptr<string> pstr_auto2(pstr_auto);假定直接用一个string指针初始化另外一个,比如:string* pstr_type2(pstr_type);那么,这两个指针都持有程序空闲存储区内的字符串地址,我们必须小心地将delete表达式只应用在一个指针上,而auto_ptr类模拟支持所有权概念.当定义auto_ptr时,它知道自己对初始化字符串拥有所有权,并且有责任删除该字符串,这是所有权授予auto_ptr对象的责任.问题是,当pstr_auto2被初始化为指向与pstr_auto相同的对象时,所有权会发生什么样的变化?我们不希望让两个auto_ptr对象都拥有同一个底层对象--这会引起重复删除对象的问题,这也是我们使用auto_ptr类型首先要防止的.