size(); auto_ptr类模板背后的主要动机是支持与普通指针类型相同的语法,但是为" />
龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

对auto_ptr的学习(2)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
那么,用auto_ptr也是一样的方式: auto_ptr pstr_auto(new string("Hello world")); pstr_auto->size(); auto_ptr类模板背后的主要动机是支持与普通指针类型相同的语法,但是为

  那么,用auto_ptr也是一样的方式:

  auto_ptr pstr_auto(new string("Hello world"));

  pstr_auto->size();

  auto_ptr类模板背后的主要动机是支持与普通指针类型相同的语法,但是为auto_ptr对象所指对象的释放提供自动管理.同时,使用auto_ptr对象并不比直接使用指针代价更高.

  在下面的情况中,用pstr_auto的值初始化pstr_auto2,并且pstr_auto的底层对象是string,会怎样呢?

  auto_ptr 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类型首先要防止的.

  当一个auto_ptr对象被用另一个auto_ptr对象初始化或赋值时,左边被赋值或初始化的对象就拥有了空闲存储区内底层对象的所有权,而右边的auto_ptr对象则撤消所有责任.于是,在我们的例子中,将是用pstr_auto2删除字符串对象,而不是pstr_auto,pstr_auto不再被用来指向字符串对象.

  类似的行为也发生在赋值操作符上,已知下列两个auto_ptr对象.

  auto_ptr p1(new int(1024));

  auto_ptr p2(new int(2048));

精彩图集

赞助商链接