【发布时间】:2019-10-28 06:20:29
【问题描述】:
假设我有以下(精简)代码:
class P { P(); P(const P&); ~P(); }
void foo(P x) {
...
}
void bar() {
P p{};
foo(p); // compiler uses P::(const P&) to construct the value for x
...
// compiler calls P::~P() on p
}
编译器必须创建p 的副本才能调用foo,因此调用者 在调用之前调用复制构造函数。我的问题是,谁负责销毁这个创建的对象?似乎有两个有效的选择:
- 被调用者(即
foo)在返回之前对其所有按值参数调用析构函数,然后调用者释放内存(通过将其从堆栈中弹出)。 - 被调用者不做任何事情,调用者(即
bar)在foo(p)调用结束的序列点之前的所有临时对象上调用析构函数。
【问题讨论】:
-
作为一般规则 - 创造者毁灭。
-
有需要知道的理由吗?如果只是好奇,请查看为您的平台生成的程序集。
-
我想知道你为什么问这个问题。如果您说“只是为了知识”-我可以接受。我很确定临时销毁是在调用方完成的。但是,依靠这个可以解决什么问题呢? (并不是说我会依赖这个。);-)
-
@Eljay 这并不能真正回答问题。看到某件事在您的平台上以特定方式发生并不能保证所有符合要求的实现都会做同样的事情。
标签: c++ language-lawyer destructor