如何解决销毁删除是否仍然需要析构函数可访问?
C ++ 20引入了“销毁运算符删除” as described below的概念:
在调用运算符delete之前,delete-expressions不会为* p执行析构函数
因此,考虑以下struct S
:
struct S {
void operator delete(S* p,std::destroying_delete_t);
private:
~S();
};
我希望下面的delete
不会插入对析构函数的调用,而只是调用我们提供的销毁运算符delete
delete new S;
但是,GCC / Clang / MSVC的行为有所不同:DEMO
只有GCC不会尝试访问~S()
,其他人仍要求~S()
可以访问。
哪个是正确的?
解决方法
gcc是正确的:// Solve : Solves specified problems.
func (ps ProblemSolver) Solve() {
val := reflect.ValueOf(ps)
specifiedProblems := []int{1,3,4}
for _,sp := range specifiedProblems{
methodName := fmt.Sprintf("Problem%d",sp)
val.MethodByName(methodName).Call(nil)
}
}
不需要访问。
如果 delete-expression 的操作数的值不是空指针值,并且所选的释放函数(参见下文)不是破坏操作符delete,则 delete-expression 将为要删除的对象或数组元素调用析构函数(如果有)。
仅在不销毁delete的情况下才调用析构函数。确实,这就是销毁delete的全部要点-让类作者可以控制何时/何时调用析构函数。因此,不要求析构函数可访问-取决于调用它的语言,取决于用户。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。