在C++中,为什么检查变量是否为nullptr会导致Access违规错误?

xbp102n0  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(162)

我主要是一个C#程序员,经常对C++土地和一些我不理解的东西进行考察。
我有一个类,它有一些FFmpeg对象作为.h文件中的成员变量,初始化如下:

  1. AVFormatContext* formatContext = nullptr;

在类的析构函数中,我检查这个对象是否是nullptr,如下所示:

  1. if(formatContext != nullptr)
  2. avformat_close_input(&formatContext);

遗憾的是,if行导致以下异常:

  1. Invalid argumentException thrown at 0x00007FFEA696920A (avformat-60.dll) in Blabla.exe: 0xC0000005: Access violation reading location 0x0000000

为什么在C++中,仅仅检查nullptr就可能导致这样的异常?
我的意思是,我并没有尝试使用对象,我只是检查地址是否为空。我甚至没有检查“有效性”,因为缺乏一个更好的词(所以这是“相同”的对象,我认为它是或地址被搞砸了)。
当我看到access violationexception时,我觉得好像有人绑架了这个对象,现在它的位置是potatos,但这肯定是不可能的吗?

编辑

让我问你这个问题,我们正在谈论现代(C++ 17)C++,注意 av_stuff 主要是FFmpeg相关的库调用。我对下面评论中的问题的逻辑和看法是否正确?

  1. AVFormatContext* formatContext = nullptr; // formatContext is ok and initialized as nullptr
  2. ...
  3. avformat_fill_the_context_(&formatContext) //formatcontex has been "filled", so its not nullptr anymore but points to a valid object
  4. ...
  5. av_do_somestuff(formatContext) //Some call that MESSES UP THE POINTER
  6. ...
  7. if(formatContext != nullptr) //here I get the exception, but my object was messed up earlier

我的思路是正确的吗,事情是这样发生的吗?

u0njafvf

u0njafvf1#

为什么在C++中,仅仅检查nullptr就可能导致这样的异常?
不是的。问题不在支票上。
我的意思是,我并没有尝试使用对象,我只是检查地址是否为空。
指针是 another 对象的成员,您还没有显示。最有可能的是 this(字面意思是this)就是问题所在。
当你说
我有一个类,它有一些FFmpeg对象作为成员变量
它告诉我们

  1. (formatContext != nullptr)

真的是

  1. (this->formatContext != nullptr)

this的成员变量的加载可能导致访问冲突:如果this不是一个有效的指针(因为您错误地将某些东西强制转换为指向您的类的指针,或者因为先前的未定义行为已经破坏了您的进程),或者可能如果this已经被删除。
你的直觉是正确的,比较不太可能是一个问题(罕见的例外是具有指针陷阱表示的平台)-你只是错过了指针必须从某个地方加载的事实。

展开查看全部
yzuktlbb

yzuktlbb2#

Invalid argument异常可能是因为&formatContext不是指向有效对象的指针,因此它是avformat_close_input函数的无效参数。
因此异常可能来自该函数(使用调试器),而不是nullptr检查,因为您正在比较两个指针(如果&操作符未重载,则为两个数字)。

相关问题