gpt4 book ai didi

c++ - 析构函数被调用

转载 作者:行者123 更新时间:2023-11-30 02:57:46 25 4
gpt4 key购买 nike

在下面的代码中,当执行从 fn 返回到 main 时,类 B 的析构函数在情况 1 中被调用,但在情况 2 中没有被调用()。我不明白这种区别,因为当使用 new 创建 A 时,两者都在堆内存上。你能解释一下吗?

class B {
public:
B() {
printf(" [B] COntsructor");
}
~B() {
printf(" [B] Destructor");
}
};

class A {
public:
A() {
printf(" [A] COntsructor");
}
~A() {
printf(" [A] Destructor");
}

B Query() { return b; } /// Case 1
B* Query() { return &b; } /// Case 2

B b;
};

void fn()
{
A *a = new A();
B b = a->Query(); // case 1
B* b = a->Query(); // case 2
return;
}

int _tmain(int argc, _TCHAR* argv[])
{
fn();
return 0;
}

最佳答案

情况 1:当您按值返回 b 时,局部变量 b 是使用复制构造函数构造的。 Return Value Optimization 优化了除一份以外的所有拷贝.局部变量 b 的析构会触发析构函数。

情况 2:当您返回 &b 时,您返回的只是一个指向 b 的指针,因此不需要销毁.

编辑:The code显示在没有相应调用构造函数的情况下调用析构函数。这是因为函数返回拷贝是通过复制构造函数发生的。

编辑 2:@ZarShardan 是正确的 - 由于 Return Value Optimization,我提到的“许多拷贝”可能不存在.

关于c++ - 析构函数被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191119/

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