0

我是 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
4

3 回答 3

1

容器,如果声明为std::vector<Point*> points;将其视为声明,这意味着您将需要在此上下文中Point* point(new Point(blah));进行一些匹配。delete当然,您应该使用 a) 该向量中的值std::vector<Point> points;,或 b) 智能指针。在大多数情况下,前者(a)。

在这种情况下,您将编写delete p1;,并且对已删除对象的访问是未定义的行为——删除后对该对象的任何访问/使用都是无用的。如果程序崩溃并向您指出错误,您会很幸运。

于 2013-02-25T06:38:13.437 回答
1

在 delete 语句之后,由编译器决定何时重用释放的内存。所以这是未定义的行为。

于 2013-02-25T06:39:56.640 回答
0

标准库容器对指针没有什么特别的作用。如果指针指向动态分配的对象,则必须在某个时候将其删除。谁,何时以及如何真正取决于应用程序的细节,但通常通过使用智能指针来自动化这个过程。

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

points[0]已被删除,并且取消引用已删除的指针是未定义的行为。这意味着任何事情都可能发生。可能发生的情况是您通过调用释放的内存delete没有被任何东西回收,因此数据仍然存在。你不能依赖这种行为。

于 2013-02-25T06:39:02.607 回答