删除后可以使用C ++成员吗?

时间:2011-03-03 00:59:53

标签: c++ class delete-operator

我编译了&运行下面粘贴的代码,令人惊讶的是它没有错误。 (克++ / Linux)的 删除的对象如何使某些成员仍然可用?这是正常行为吗?

#include <iostream>

using namespace std;

class chair {
    public:
    int height;
    int x;
    int y;

    chair() {
        before = last;
        if(last!=NULL)
            last->after = this;
        else
            first = this;
        last = this;
        after = NULL;
    }

    ~chair() {
        if(before != NULL)
            before->after = after;
        else
            first = after;
        if(after != NULL)
            after->before = before;
        else
            last = before;
    }

    chair* before;
    chair* after;
    static chair* first;
    static chair* last;
};
chair* chair::first;
chair* chair::last;

int main() {
    chair *room = NULL;
    int tempx = 0;
    int tempy = 1;

    while(tempx<=3) {

        tempy = 1;
        while(tempy<=3) {
            room = new chair();
            room->x = tempx;
            room->y = tempy;
            tempy++;
        }

        tempx++;
    }

    room = chair::first;
    while(room!=NULL) {
        cout << room->x << "," << room->y << endl;
        delete room;
        room = room->after;
    }
}

3 个答案:

答案 0 :(得分:12)

您正在做的是 undefined behavior 您正在访问已删除的对象。您正在查看的数据仍然可用,存储该信息的内存区域尚未被覆盖,但没有任何阻止这种情况发生。

答案 1 :(得分:2)

delete不会更改指针变量本身,因此它仍然指向旧的内存位置。

你可以尝试ro访问那个内存位置,但是如果你在那里生活的对象被删除后你会发现有用的东西,取决于你有多幸运。通常它是未定义的行为。

答案 2 :(得分:1)

通过调用delete,您只需告诉程序您不再需要该内存块。然后它可以继续使用它想要的内存,在你的情况下它不需要那个内存,所以它保持原样。稍后您的程序可能会使用该内存块,如果您继续访问它,您将获得垃圾数据。

http://en.wikipedia.org/wiki/Delete_%28C%2B%2B%29