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

时间:2010-11-15 00:47:59

标签: 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 counting works!");
}

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

3 个答案:

答案 0 :(得分:1)

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

  1. 您创建了一个指向已在某处创建的wxImage的指针。
  2. 然后删除它。
  3. 然后,您尝试取消引用已删除的指针,并在结果对象上调用'IsOk()',由于上一步,该对象不再存在。
  4. 步骤2可能已经或可能没有实际删除该对象,但它也可能删除了该引用。根据wx如何实现引用计数以及如何管理引用,wxImage对象在例程开始时的引用计数可能为1 - 因此,wxDELETE将引用计数减少为零,从而将对象删除为好。

    如果您按照自己的方式使用指针,则wx无法使用引用计数自动管理对象。也许你想使用复制构造函数,并停止使用手动内存处理? C ++有RAII技术 - 使用它。

    最后,我可以问为什么m_default_image是一个指针?你只是一直使用原始指针让自己变得艰难。

答案 1 :(得分:0)

要添加到Arafangion的答案(如果我有足够的重复点,我会评论),如果你阅读wxDELETE()的文档,你会看到它实际上说:

  

此函数使用operator delete释放指针,并将其设置为NULL。

C ++指针与wxWidgets中引用计数的实现没有任何关系(我认为除了使用智能指针时我不认为它在其他任何地方),并且因为wxDELETE用于指针,所以也没有与引用计数完全无关,除了它删除了一个可能引用或未引用的对象,如果是,并且对象引用计数大于1,则该对象确实没有被删除,但是,你的指针仍然无效。

答案 2 :(得分:0)

引用计数由wxImage 对象在内部使用,这意味着您可以在共享基础图像数据时以低成本方式复制它们。它未在wx API中公开,并且与wxImage 指针无关。