2011-07-19 82 views
5

我正在用C++ STL讀取auto_ptr的實現。C++中auto_ptr的指針運算

我看到指針類似於 - >和*的常用操作被重載,因此它們保留了相同的含義。但是,將指針算術工作在自動指針?

說我有一個自動指針數組,我希望能夠做一些像數組+ 1,並期望獲得該數組的第二個元素的地址。我如何得到它?

我對這個要求沒有任何實際的應用,只是出於好奇而問。

+1

你嘗試過這麼遠嗎?我想你可以花5分鐘時間,寫一個測試程序並自己解決這個問題。 – 2011-07-19 15:54:12

+2

自動指針數組或指向數組的自動指針? –

+0

該標準只允許在同一個數組內指向的指針之間進行指針運算(或者超過該數組的末尾的指針)。所以'auto_ptr'的算術根據定義會代表一個錯誤。看@博的答案。 – Nemo

回答

10

一個auto_ptr只能指向單個元件,因爲它使用delete(而不是delete[]),以刪除它的指針。

所以在這裏沒有用於指針算術。

如果您需要一個對象數組,通常的建議是使用std :: vector來代替。

+0

我們可以有自動指針數組?所以在概念上做類似這樣的事情:std :: vector > array [10]; auto_ptr onep; ONEP =陣列; onep + 1 - > display()有意義嗎? – xyz

+0

這是一個auto_ptr向量的數組。 'auto_ptr'在容器內不起作用。 –

+0

如果你真的**小心你有一個auto_ptrs數組,但我從來沒有見過一個。你可以**不把它們放在一個矢量中,因爲矢量可能會嘗試複製並丟失指針。如果你想要一些'int's,你可以使用'vector ',它會處理大部分事情,比如完成後釋放內存。 –

1

您需要在此處查看auto_ptr的文檔。

沒有爲auto_ptr定義指針算術。

auto_ptr<int> p1(new int(1)); 
*p2 = 5; // Ok 
++p2;  // Error, no pointer arithmetic 
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(); 
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 
+0

這裏p是你的常規指針,我知道算術運算+工作。我想知道(並嘗試)如果我可以做std :: auto_ptr p;然後p + 1等..並有一定的意義。 – xyz

+1

'std :: auto_ptr p'意味着'p'是一個指向單個整數的指針。那麼在這種情況下,'p + 1'是如何理解的?另外,什麼是「某事」? – Praetorian

+0

......某事。也許不常用。是的,p + 1在這方面沒有意義。但我想擁有一個自動指針數組,然後對指向數組基的自動指針進行算術運算。但就像有人提到,自動指針的stl defn不允許任何這樣的算術運算符,也許是因爲它沒有任何意義,只會使事情複雜化。 – xyz