我正在用C++ STL讀取auto_ptr的實現。C++中auto_ptr的指針運算
我看到指針類似於 - >和*的常用操作被重載,因此它們保留了相同的含義。但是,將指針算術工作在自動指針?
說我有一個自動指針數組,我希望能夠做一些像數組+ 1,並期望獲得該數組的第二個元素的地址。我如何得到它?
我對這個要求沒有任何實際的應用,只是出於好奇而問。
我正在用C++ STL讀取auto_ptr的實現。C++中auto_ptr的指針運算
我看到指針類似於 - >和*的常用操作被重載,因此它們保留了相同的含義。但是,將指針算術工作在自動指針?
說我有一個自動指針數組,我希望能夠做一些像數組+ 1,並期望獲得該數組的第二個元素的地址。我如何得到它?
我對這個要求沒有任何實際的應用,只是出於好奇而問。
一個auto_ptr只能指向單個元件,因爲它使用delete
(而不是delete[]
),以刪除它的指針。
所以在這裏沒有用於指針算術。
如果您需要一個對象數組,通常的建議是使用std :: vector來代替。
我們可以有自動指針數組?所以在概念上做類似這樣的事情:std :: vector
這是一個auto_ptr向量的數組。 'auto_ptr'在容器內不起作用。 –
如果你真的**小心你有一個auto_ptrs數組,但我從來沒有見過一個。你可以**不把它們放在一個矢量中,因爲矢量可能會嘗試複製並丟失指針。如果你想要一些'int's,你可以使用'vector
您需要在此處查看auto_ptr的文檔。
沒有爲auto_ptr
定義指針算術。
auto_ptr<int> p1(new int(1));
*p2 = 5; // Ok
++p2; // Error, no pointer arithmetic
這實際上與指針算術無關。
// 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();
將指針向前推進一組對象仍然工作相同。下面是一個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
這裏p是你的常規指針,我知道算術運算+工作。我想知道(並嘗試)如果我可以做std :: auto_ptr
'std :: auto_ptr
......某事。也許不常用。是的,p + 1在這方面沒有意義。但我想擁有一個自動指針數組,然後對指向數組基的自動指針進行算術運算。但就像有人提到,自動指針的stl defn不允許任何這樣的算術運算符,也許是因爲它沒有任何意義,只會使事情複雜化。 – xyz
你嘗試過這麼遠嗎?我想你可以花5分鐘時間,寫一個測試程序並自己解決這個問題。 – 2011-07-19 15:54:12
自動指針數組或指向數組的自動指針? –
該標準只允許在同一個數組內指向的指針之間進行指針運算(或者超過該數組的末尾的指針)。所以'auto_ptr'的算術根據定義會代表一個錯誤。看@博的答案。 – Nemo