我主要是一个C#程序员,经常对C++土地和一些我不理解的东西进行考察。
我有一个类,它有一些FFmpeg对象作为.h文件中的成员变量,初始化如下:
AVFormatContext* formatContext = nullptr;
在类的析构函数中,我检查这个对象是否是nullptr,如下所示:
if(formatContext != nullptr)
avformat_close_input(&formatContext);
遗憾的是,if行导致以下异常:
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相关的库调用。我对下面评论中的问题的逻辑和看法是否正确?
AVFormatContext* formatContext = nullptr; // formatContext is ok and initialized as nullptr
...
avformat_fill_the_context_(&formatContext) //formatcontex has been "filled", so its not nullptr anymore but points to a valid object
...
av_do_somestuff(formatContext) //Some call that MESSES UP THE POINTER
...
if(formatContext != nullptr) //here I get the exception, but my object was messed up earlier
我的思路是正确的吗,事情是这样发生的吗?
2条答案
按热度按时间u0njafvf1#
为什么在C++中,仅仅检查nullptr就可能导致这样的异常?
不是的。问题不在支票上。
我的意思是,我并没有尝试使用对象,我只是检查地址是否为空。
指针是 another 对象的成员,您还没有显示。最有可能的是 this(字面意思是
this
)就是问题所在。当你说
我有一个类,它有一些FFmpeg对象作为成员变量
它告诉我们
真的是
而
this
的成员变量的加载可能导致访问冲突:如果this
不是一个有效的指针(因为您错误地将某些东西强制转换为指向您的类的指针,或者因为先前的未定义行为已经破坏了您的进程),或者可能如果this
已经被删除。你的直觉是正确的,比较不太可能是一个问题(罕见的例外是具有指针陷阱表示的平台)-你只是错过了指针必须从某个地方加载的事实。
yzuktlbb2#
Invalid argument
异常可能是因为&formatContext
不是指向有效对象的指针,因此它是avformat_close_input
函数的无效参数。因此异常可能来自该函数(使用调试器),而不是
nullptr
检查,因为您正在比较两个指针(如果&操作符未重载,则为两个数字)。