gpt4 book ai didi

c++ - 引用C++上的默认析构函数行为

转载 作者:行者123 更新时间:2023-12-01 15:10:43 27 4
gpt4 key购买 nike

我已经在互联网上进行搜索,但是找不到关于默认析构函数行为的任何资源。

例:

struct A{
int &a;
A(int&i): a(i){}
}
void f(){
int* i = new int;
A* a = new A(*i);
delete a; // is i been destroyed?
}

在这两种情况下,我都可以在哪里找到相关资源?或者有人可以向我解释它的行为?

最佳答案

引用不是对象。他们没有破坏者。他们有生命。对象也具有生存期,就像C++中的任何其他类型一样。

区别在于,当对象的生存期结束时,将调用其析构函数。
但是,当任何其他类型的生命周期结束时,它们的资源将被释放。

在引用的情况下,它们持有的资源是指向另一个值的内存地址。不是值(value)本身。因此,当它被释放时,该值保持不变。存储的内存地址是要释放的内容,而不是值。

使用new / delete时,您将手动指定生命周期的开始时间(新生命周期)和生命周期的结束时间(删除生命)。

以您的示例为例,您的生命周期X和Y如下:

struct A{
int &a;
A(int&i): a(i){}
}
void f(){
int* i = new int; // ----------------------------------|X
A* a = new A(i); // -------------------|Y |X
delete a; // is i been destroyed? // --|Y |X
} // |X
// |X...

如您所见,X的生命周期将永远持续,因为您没有手动删除它,而是使用new创建了它。这意味着 i中保留的值在删除 a的行之后仍然有效。

PD:您应该改写 new A(*i),否则会出现编译器错误。

关于c++ - 引用C++上的默认析构函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61507470/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com