我的程序崩溃了,我很难绕过它崩溃的原因。主要问题是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仍然指向有效的东西?
答案 0 :(得分:1)
让我解释一下发生了什么:
步骤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
指针无关。