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

问题描述:

我的程序崩溃了,我正在为了崩溃而不知所措。主要的问题是wxwidgets文档说引用计数用于wxImage对象。这到底是什么意思?为什么这段代码会崩溃?wxWidgets中的引用计数,它在这种简单情况下如何工作?

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()。不应该引用计数阻止实际的对象被删除,所以我的ttr仍然指向有效的东西?

让我解释发生了什么:

  1. 您创建一个指向您已经某处创造了一个wxImage。
  2. 然后您将其删除。
  3. 然后,您尝试取消引用已删除的指针,并且因为上一步,因此不再存在的结果对象上调用'IsOk()'。

步骤2可能或可能没有真正删除该对象,但它也可能删除该引用。根据wx如何实现引用计数以及如何管理引用,wxImage对象在例程开始时可能引用计数为1,因此,wxDELETE将引用计数减少为零,因此将对象删除为好。

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

最后,我可以问为什么m_default_image是一个指针?通过始终使用原始指针,您只会让自己难过。

为了增加Arafangion的答案(我只想评论,如果我有足够的代表处点,这样做的),如果你读了wxDELETE()的文件,你会看到,它实际上说:

该函数使用操作符delete来释放指针并将其设置为NULL。

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

引用计数在内部使用wxImage对象这意味着您可以便宜地复制它们,因为底层图像数据是共享的。它没有暴露在wx API中,并且与wxImage指针绝对没有任何关系。