2013-02-25 97 views
0

我是新來的C++,發現它混淆了stl容器上的處理指針。 stl容器如何處理指針?STL容器上的指針

Point *p1 = new Point(10, 10); 
std::vector<Point*> points; 
points.push_back(p1); 

delete p1; // or delete points[0] 

std::cout << points[0]->getID() << "\n"; //why does this still display 10, 10 after deleting above? 
std::cout << p1->getID(); //ofcourse, this one will output garbage 

//getID method displays xy coordinates given as parameters when object is created 
//The result displayed 
10, 10 
-1, 12337 
+3

簡單:未定義的行爲。 – chris 2013-02-25 06:37:16

+2

我懷疑你是否需要指針。是否有一個原因,你爲什麼不「按價值」放在你的矢量點? – leemes 2013-02-25 06:43:07

回答

0

標準庫容器對指針沒有特別的要求。如果指針指向動態分配的對象,那麼在某個時刻這些對象必須被某個人刪除。誰,何時以及如何真正取決於應用程序的細節,但通常通過使用smart pointers來自動執行此過程。

std::cout << points[0]->getID() << "\n"; //why does this still display 10, 10 after deleting above? 

points[0]已被刪除,並取消引用刪除的指針不確定的行爲。這意味着什麼都可能發生。可能發生的情況是,通過調用delete而釋放的內存尚未被回收,因此數據仍然存在。你不能依賴那種行爲。

1

容器,如果聲明爲std::vector<Point*> points;將會把它當作聲明Point* point(new Point(blah));,這意味着你將需要一些配套delete在這方面。當然,你應該使用a)該向量中的值std::vector<Point> points;,或b)智能指針。在大多數情況下,前者(a)。

在這種情況下,你會寫delete p1;,並且刪除的對象的訪問是未定義的行爲 - 刪除後任何訪問/使用該對象是無用的。如果程序崩潰並且向您指出錯誤,那麼您很幸運。

1

刪除語句後,它直到編譯器何時重新使用釋放的內存。 所以它是未定義的行爲。

+0

稍微擴展一下:一旦你「刪除」一個指針,它指向的堆內存現在被標記爲可用。但是,這並不意味着它被零覆蓋。因此,如果您嘗試訪問它,您可能(或不可能)找到駐留在該內存位置的最後分配的值。 – 2013-02-25 06:43:47