代码之家  ›  专栏  ›  技术社区  ›  A. Dziedziczak

为什么我可以访问已删除但在C++中具有虚拟析构函数的对象?[副本]

  •  -1
  • A. Dziedziczak  · 技术社区  · 7 年前

    我用2个类创建了简单的代码。

    #include <list>
    #include <iostream>
    
    using namespace std;
    
    class MyItem {
            public:
                    int myVar;
                    MyItem() {
                            this->myVar = 10;
                    }
                    ~MyItem(){
                    }
    };
    
    class Container {
            public: 
                    list<MyItem*> items;
                    Container() {
                    }
                    ~Container(){
                            for (auto *item: this->items) {
                                    delete item;
                            }
                    }
                    void addItems(MyItem* item) {
                            this->items.push_back(item);
                    }
    };
    
    
    int main() {
            MyItem* i1 = new MyItem();
            MyItem* i2 = new MyItem();
            MyItem* i3 = new MyItem();
            cout << i1->myVar << endl;
    
            Container* c1 = new Container();
            c1->addItems(i1);
            c1->addItems(i2);
            c1->addItems(i3);
    
            delete c1;
    
            cout << i1->myVar << endl;
            cout << i2->myVar << endl;
            cout << i3->myVar << endl;
    }
    

    而且没有 virtual ~MyuItem() 在里面 MyItem I类按预期获得输出:

    10 <- myVar before deconstructor
    0  <- memory garbage
    28802064
    28802096
    

    但当我将代码更改为:

    virtual ~MyItem(){
    }
    

    输出看起来不同:

    10
    10
    10
    10
    

    为什么我仍然可以从不应该指向包含数据的内存的实例中访问解引用值?我不明白虚拟析构函数会如何影响它。或者还有其他我找不到的错误。我是不是少了什么?

    是的,我想在容器类析构函数中删除它。只是因为我想了解它是如何在原始指针上工作的。我知道我应该使用智能指针,因为它们会自动释放内存。

    1 回复  |  直到 7 年前
        1
  •  2
  •   SoronelHaetir    7 年前

    访问已删除的对象是未定义的行为,没有任何东西表明库必须清除内存,它可以或不可以。你正在做的事情是你不能指望工作的,尽管在这种情况下它发生了。