对象实例在销毁后仍然可以访问

问题描述 投票:0回答:1

我有一个

Animal
结构体,其中
Dog
结构体作为数据成员,我的问题是为什么创建的
Dog
实例(在
Animal
内部)仍然可以通过分配的
Animal
实例进行访问,甚至
Dog
被销毁后(如输出所示)

struct Dog {
    Dog() {}
    Dog(std::string n) : name(n) {std::cout << "dog constructed\n";}
    ~Dog() {std::cout << "dog destructed\n";}

    std::string name;
};

struct Animals {
    Animals() {std::cout << "animal constructed\n";}
    ~Animals() {std::cout << "animal destructed\n";}

    Dog dog;
};

Animals*    foo() {
    Animals*    animals = new Animals;
    animals->dog = Dog("layka");
    return animals;
}

int main() {
    Animals*    animals = foo();
    std::cout << animals->dog.name << std::endl;
    delete animals;
}

输出:

animal constructed
dog constructed
dog destructed
layka
animal destructed
dog destructed

有人可以解释一下为什么动物先于狗被消灭吗?为什么它被摧毁了两次而只建造了一次?

我没想到

dog.name
在被摧毁后会有相同的价值

c++ oop struct destructor
1个回答
0
投票
  1. 动物构造

  2. 狗构造:一些临时的

    Dog("layka")
    构造及其副本 存储在
    animals->dog

  3. 狗被摧毁:在

    Dog("layka")
    建造的一些狗被摧毁 但
    animals->dog
    还活着。

  4. 莱卡

  5. animal destructed:动物析构函数的开始,但不是结束

  6. 狗被破坏:

    animals->dog
    析构函数

    的开始

动物在动物->狗之前没有被消灭。输出顺序不是破坏顺序。

© www.soinside.com 2019 - 2024. All rights reserved.