Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ wxWidgets中的引用计数,在这种简单的情况下它是如何工作的?_C++_Wxwidgets - Fatal编程技术网

C++ wxWidgets中的引用计数,在这种简单的情况下它是如何工作的?

C++ wxWidgets中的引用计数,在这种简单的情况下它是如何工作的?,c++,wxwidgets,C++,Wxwidgets,我的程序正在崩溃,我很难理解它为什么会崩溃。主要问题是wxwidgets文档说引用计数用于wxImage对象。这到底意味着什么?为什么这个代码会使它崩溃 wxImage* t = m_default_image; //m_default_image is a pointer pointing to a valid wxImage object. wxDELETE(m_default_image); if(t->IsOk()) { wxLogMessage("reference c

我的程序正在崩溃,我很难理解它为什么会崩溃。主要问题是wxwidgets文档说引用计数用于wxImage对象。这到底意味着什么?为什么这个代码会使它崩溃

wxImage* t = m_default_image; //m_default_image is a pointer pointing to a valid wxImage object.

wxDELETE(m_default_image);
if(t->IsOk())
{
    wxLogMessage("reference counting works!");
}

崩溃的行是t->IsOK()。引用计数不应该阻止实际对象被删除,所以我的t ptr仍然指向有效的对象吗

让我解释一下发生了什么:

  • 创建指向已在某处创建的wxImage的指针
  • 然后删除它
  • 然后尝试取消对已删除指针的引用,并对结果对象调用“IsOk()”,因为上一步,该对象已不存在
  • 步骤2可能实际删除了对象,也可能没有实际删除对象,但很可能也删除了引用。根据wx实现引用计数的方式以及您管理引用的方式,wxImage对象在例程开始时的引用计数可能为1—因此,wxDELETE会将引用计数减少为零,从而也会删除该对象

    如果您使用的是指针,wx无法使用引用计数自动管理您的对象。也许您想使用复制构造函数,并停止使用手动内存处理?C++有RAII技术,使用它。
    最后,我能问一下为什么m_default_image是指针吗?你一直在使用原始指针,这只会让你的生活变得艰难。

    为了补充Arafangion的答案(如果我有足够的代表点,我会发表评论),如果你阅读wxDELETE()的文档,你会发现它实际上说:

    此函数使用运算符delete释放指针,并将其设置为NULL


    C++指针与wxWidgets中引用计数的实现没有任何关系(我认为除了使用智能指针之外,它在其他任何地方都不会做),而且由于wxDELETE是与指针一起使用的,它也与引用计数完全无关,只不过它删除了一个对象,该对象可能已被引用计数,也可能未被引用计数,如果是,且对象引用计数大于1,则该对象实际上并未被删除,您的指针仍然无效。

    引用计数由
    wxImage
    对象内部使用,这意味着您可以在共享基础图像数据时廉价复制它们。它没有在wxapi中公开,而且肯定与
    wxImage
    指针没有任何关系