[英]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.