C ++中auto_ptr的指针算法

时间:2011-07-19 15:50:43

标签: c++

我正在阅读C ++ STL中auto_ptr的实现。

我看到指针上常用的操作,比如 - >和*重载,以便它们保持相同的含义。但是,指针算法会在自动指针上工作吗?

假设我有一个自动指针数组,我希望能够执行类似于数组+ 1的操作并希望获得数组的第二个元素的地址。我怎么得到它?

我对此要求没有任何实际应用,只是出于好奇而提出。

4 个答案:

答案 0 :(得分:10)

auto_ptr只能指向一个元素,因为它使用delete(而不是delete[])来删除它的指针。

所以这里没有指针运算。

如果你需要一个对象数组,通常建议使用std :: vector。

答案 1 :(得分:1)

您需要在此处查看 auto_ptr 的文档。

没有为auto_ptr定义指针算法。

auto_ptr<int>  p1(new int(1));  
*p2 = 5;   // Ok
++p2;       // Error, no pointer arithmetic

答案 2 :(得分:1)

这实际上与指针算术无关。

// applies as well with soon-to-be-deprecated std::auto_ptr
typedef std::unique_ptr<T> smart_ptr;

smart_ptr array[42];

// access second element
array[1];
// take address of second pointer
&array[1];
// take address of second pointee
array[1].get();

答案 3 :(得分:1)

向下推进一个对象数组的指针仍然可以正常工作。这是一个example

#include <memory>
#include <iostream>

int main()
{
  std::auto_ptr<int> foo[3];

  foo[0] = std::auto_ptr<int>( new int(1) );
  foo[1] = std::auto_ptr<int>( new int(2) );
  foo[2] = std::auto_ptr<int>( new int(3) );

  std::auto_ptr<int> *p = &foo[0];

  std::cout << **p << std::endl;
  std::cout << **(p + 1) << std::endl;
}

输出:

1
2