为什么我的 C++对象失去其 VPTr
在调试程序的核心转储之一时,我遇到了这样一种情况,其中包含的多态对象丢失了其 VPTr,并且我可以看到它指向 NULL。
当对象失去其 VPTr 时可能会出现什么情况。
提前致谢, 布里杰什
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在调试程序的核心转储之一时,我遇到了这样一种情况,其中包含的多态对象丢失了其 VPTr,并且我可以看到它指向 NULL。
当对象失去其 VPTr 时可能会出现什么情况。
提前致谢, 布里杰什
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
内存已被废弃,即某些内容覆盖了内存。
您通过调用delete或直接调用析构函数来销毁它。这通常不会将 vptr 设为 NULL,它最终只会使其指向基类的 vtable,但这取决于您的实现。
最有可能的是情况 1。如果您有一个带有内存断点的调试器,并且您可以可靠地重现问题,请在 vptr 上设置一个内存断点,然后查看修改它的内容。
The memory has been trashed, i.e. something overwrote the memory.
You destroyed it by calling delete or by invoking the destructor directly. This typically does not NULL out the vptr, it will just end up having it point to the vtable of the base class, but that depends on your implementation.
Most likely, case 1. If you have a debugger that has memory breakpoints and if you can reproduce the problem reliably, set a memory breakpoint on the vptr and see what's modifying it.
可能有什么东西覆盖了整个对象。像这样的东西:
这很好,直到它被用在带有 vptr 的对象上。
Likely something overwrote the whole object. Something like this:
which is fine until it is used on an object with vptr.
您可能正在尝试在对象的析构函数期间使用 v 表。 v 表目前不可用。
It may be that you are trying to use the v-table during your object's destructor. The v-table is not available at this time.