簡體   English   中英

STL容器上的指針

[英]Pointers on STL container

我是c ++的新手,發現在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

容器,如果聲明為std::vector<Point*> points; 將它視為聲明Point* point(new Point(blah)); ,這意味着在這種情況下你需要一些匹配的delete 當然,你應該使用a)矢量std::vector<Point> points; ,或b)智能指針。 在大多數情況下,前者(a)。

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

在刪除語句之后,它可以使編譯器在何時重用該釋放的內存。 所以它是未定義的行為。

標准庫容器對指針沒有任何特殊之處。 如果指針指向動態分配的對象,則必須在某些時候刪除這些對象。 誰,何時以及如何真正依賴於應用程序的細節,但通常使用智能指針自動執行此過程。

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

points[0]已被刪除,並且取消引用已刪除的指針是未定義的行為 這意味着一切都可能發生。 可能發生的事情是你通過調用delete釋放的內存沒有被回收任何東西,所以數據仍然存在。 你不能依賴這種行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM