gpt4 book ai didi

c++ - 直接调用(虚拟)析构函数是否有效?

转载 作者:可可西里 更新时间:2023-11-01 18:37:17 26 4
gpt4 key购买 nike

this answer ,Ryan直接调用了虚析构函数。我已经在 VS2010 中测试了代码,它正确地调用了所有析构函数(使用日志语句进行了测试)。这样做真的有效吗?这种方法有哪些问题、缺陷甚至优点?

我只能认为这是一种真正强制重置实际类型的方法,即使它们没有覆盖虚拟 reset 函数,因为它们至少必须在它们的析构函数。

此外,调用析构函数究竟会带来什么样的副作用?在这样的析构函数调用之后使用对象是未定义的行为吗?如果立即用 new (this) MyClass(); 调用重新初始化它会怎样?

最佳答案

手动调用析构函数是完全有效的,不管它是否是虚拟的。您只想确保每次构造函数调用都只调用一次。

Is it undefined behaviour to use the object after such a destructor call? 

是的。

What if one immediatly reinitializes it with a new (this) MyClass(); call?

仍然可怕地未定义。

不要手动销毁一个对象,除非你必须手动放置它,例如使用 placement new 或一些等价物,并且绝对不要像那样重新初始化已破坏的对象并希望避免 UB。像 std::vector 这样的类非常明确地使访问被破坏的对象成为 UB,并且即使您随后在它的位置创建一个新元素,它仍然是 UB。

关于c++ - 直接调用(虚拟)析构函数是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6036086/

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