龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

对auto_ptr的学习(3)

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
赋值操作符可以将一个auto_ptr对象拷贝到另一个中,如下所示: p1 = p2; 在赋值之前,由p1指向的对象被删除.赋值之后,p1拥有int型对象的所有权,该对象值为2048

  赋值操作符可以将一个auto_ptr对象拷贝到另一个中,如下所示:

  p1 = p2;

  在赋值之前,由p1指向的对象被删除.赋值之后,p1拥有int型对象的所有权,该对象值为2048,p2不再被用来指向该对象.

  在auto_ptr定义的第三种形式中,我们创建一个auto_ptr对象,但是没有用指针将其初始化.例如:

  auto_ptr p_auto_int;

  因为p_auto_int没有被初始化指向一个对象,所以它的内部指针值被设置为0,这意味着对它解引用会使程序出现未定义的行为,就好像我们直接解引用一个值为0的指针时所发生的一样.

  对于普通指针,我们只需测试是否为0,例如:

  if (pi != 0);

  但是怎样测试一个auto_ptr对象是否指向一个底层对象呢?操作get()返回auto_ptr对象内部的底层指针,所以为了判断auto_ptr指针是否指向一个对象,可以如下编程:

  int *pi = 0;

  if (p_auto_int.get() != 0 && *p_auto_int != 1024)

  *p_auto_int = 1024;

  如果它没有指向一个对象,那么怎样使其指向一个呢?即怎样设置一个auto_ptr对象的底层指针?我们可以用reset()操作,例如:

  p_auto_int.reset(new int(1024));

  我们不能够在auto_ptr对象被定义之后,再用new表达式创建对象的地址来直接向其赋值,因此,我们不能这样写:

  void example()

  {

  auto_ptr pi;

  {

  pi = new int(4);

  }

  }

  如果为了重置一个auto_ptr对象,我们必须使用reset()函数,我们可以向reset()传递一个指针,如果不希望设置该auto_ptr对象的话,可以传递一个0值.如果auto_ptr当前指向一个对象并且该auto_ptr对象拥有该对象的所有权,则该对象在底层指针被重置之前,首先被删除,例如:

精彩图集

赞助商链接