我有一个
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
在被摧毁后会有相同的价值
动物构造
狗构造:一些临时的
Dog("layka")
构造及其副本
存储在 animals->dog
狗被摧毁:在
Dog("layka")
建造的一些狗被摧毁
但animals->dog
还活着。
莱卡
animal destructed:动物析构函数的开始,但不是结束
狗被破坏:
animals->dog
析构函数的开始
动物在动物->狗之前没有被消灭。输出顺序不是破坏顺序。