gpt4 book ai didi

c++ - C++ 中奇怪的 null ref

转载 作者:行者123 更新时间:2023-11-27 23:58:24 25 4
gpt4 key购买 nike

我有一小段 C++ 代码让我抓狂。每当它运行时,它都会在一个非常意想不到的地方抛出空引用异常。

void CSoundHandle::SetTarget(CSound* sound)
{
assert(_Target == nullptr);
if (sound == nullptr) { return; }

_Target = sound;

// This works just fine.
_Target->Play();

// This is the code that throws the exception. It doesn't seem possible, as
// we should not be able to get here if 'sound' is null.
_Target->Stop();
}

那到底是怎么回事呢?输出窗口中的消息是:

this->_Target-> was nullptr.
0xC0000005: Access violation reading location 0x00000014

我已经在反汇编中确认它也没有发生在 Stop 函数内部。这怎么可能?

编辑:声音指针确实已初始化,'this' 和 'this->Target' 非空。

编辑 2:我通过稍微更改 Stop 函数的声明以某种方式解决了这个问题:

// From this.
virtual void Stop();

// To this.
void Stop();

这看起来特别奇怪,因为 Play() 也是虚拟的,但运行起来没有任何问题。我不能说我以前见过这样的事情。程序的其余部分没有其他名为“停止”的函数,也没有 CSound 的子类,所以我有点困惑。

最佳答案

读取位置 0x00000014 意味着您正在尝试访问位于对象开头 0x14 字节处的字段。指向该对象的指针设置为空。所以问题出在你的函数的调用者:它传递了一个指向 sound 的错误指针,它既不是 null 也不是有效的。这就是为什么你的函数中的 null 检查通过了(0x14 不是 null),但你仍然崩溃。

更新:对问题的第二次编辑表明问题出在调用虚函数上。这里的null是当时的虚指针,0x14是Stop虚函数的偏移量。虚拟指针在对象构造期间设置(在编译器生成的代码中),并且永远不应指向 0。如果指向 0,则程序的某些部分正在破坏对象。一种易于检测的情况是尝试重置对象,但内存损坏(例如,越界写入数组)也可能导致此问题。

关于c++ - C++ 中奇怪的 null ref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40898648/

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