Xeo*_*Xeo 7 c++ self-destruction virtual-destructor
在这个答案中,Ryan直接调用虚拟析构函数.我已经在VS2010中测试了代码,它正确地调用了所有析构函数(使用日志记录语句测试).这样做真的有效吗?这种方法有哪些问题,缺陷甚至是好处?
我只能将它视为真正强制重置实际类型的一种方法,即使它们不覆盖虚reset函数,因为它们至少必须在它们的析构函数中清理.
另外,对析构函数的调用会带来什么样的副作用呢?在这样的析构函数调用之后使用该对象是不确定的行为?如果一个人立即通过new (this) MyClass();电话重新初始化该怎么办?
手动调用析构函数是完全有效的事情,无论它是否是虚拟的。您只想确保每次调用构造函数时只调用一次。
Is it undefined behaviour to use the object after such a destructor call?
Run Code Online (Sandbox Code Playgroud)
是的。
What if one immediatly reinitializes it with a new (this) MyClass(); call?
Run Code Online (Sandbox Code Playgroud)
仍然可怕地未定义。
不要手动破坏一个对象,除非你必须手动放置它,例如使用新的放置或类似的东西,并且绝对不要像这样重新初始化一个被破坏的对象并希望避免UB。像这样的类std::vector非常显式地访问被破坏的对象 UB,并且即使您随后在其位置创建了一个新元素,它仍然是 UB。
| 归档时间: |
|
| 查看次数: |
3393 次 |
| 最近记录: |