取消引用指向不再存在的帧的指针
Dereferencing a pointer to a frame that doesn't exist anymore
我想控制MessagesViewer
帧的唯一性,
和这段代码:
MessagesViewer* m_pMsgViewer = NULL;
void Application::ShowMessagesViewer()
{
if (m_pMsgViewer == NULL)
{
m_pMsgViewer = new MessagesViewer(
wxGetApp().GetContainer()->GetAppData()->GetMessages()
);
}
else
{
m_pMsgViewer->FillPage(wxGetApp().GetContainer()->GetAppData()->GetMessages());
m_pMsgViewer->SetFocus();
}
}
但是当我第一次调用它时,m_pMsgViewer
开始引用内存中的有效数据。当我关闭MessagesViewer
帧时,它会自动销毁它,但指针仍然引用旧地址,我无法控制从这个客户端代码销毁帧。
如何解除对销毁帧的指针的引用?
@bogdan已经提出了一个很好的解决方案,但是还有另一个更自动的解决方案:将帧指针存储在wxweakreft <>中。即保持与现在完全相同的代码,但将声明替换为
wxWeakRef<MessagesViewer> m_pMsgViewer;
当窗口被破坏时,弱引用将自动重置为NULL
。
一个解决方案是在MessagesViewer
关闭时将m_pMsgViewer
设置回nullptr
。一种安全的方法是在框架中添加wxEVT_CLOSE_WINDOW
的处理程序。例如,将以下代码添加到MessagesViewer
的构造函数中:
Bind(wxEVT_CLOSE_WINDOW, [](wxCloseEvent& evt)
{
m_pMsgViewer = nullptr;
evt.Skip();
});
evt.Skip()
允许事件进一步传播到wx提供的默认处理程序。
这个简单的例子假设m_pMsgViewer
是一个全局变量。如果它实际上包含在Application
对象中,则必须添加一些访问它的方法。
在
MessagesViewer
的析构函数中添加这样的代码显然不是一个好主意,因为根据文档,MessagesViewer
对象的实际销毁是延迟的,因此理论上Application::ShowMessagesViewer()
可以在已经关闭并标记为销毁但尚未实际销毁的帧上调用FillPage()
。处理close事件会提前重置指针,从而避免上述问题。
您需要以某种方式标记messagesviewer已被销毁并且不能再引用。这意味着除了m_pMsgViewer之外还有一些额外的信息。
相关文章:
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 构造函数 (C++) 中的 char 指针参数存在问题
- C++为什么我的指针选择排序中存在分段错误?
- 迭代时将指向differents类型的指针保存在std::向量中
- 如果模板中存在成员函数指针,如何获取该指针
- 指向类成员函数的指针中存在类型转换错误
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 是否存在将长整型转换为指针有效的情况
- C ++如何创建一个即使对象被覆盖也会持续存在的指针?
- 指向派生作品的基本指针,即使派生对象不存在
- 这个危险指针示例是否因为 ABA 问题而存在缺陷?
- 指向可能不存在的对象的指针向量
- 如果存在任何循环关系,我应该假设弱指针使用吗?
- 带有功能指针的Typedef:函数不存在
- 即使在返回值之前释放后,数据仍在指针中仍然存在
- C++尝试删除不存在的指针
- 如何使用shared_ptr确保指针的存在
- 构造函数中指针到指针的默认值存在问题
- 指向类的指针存在问题
- 时间指针存在吗?