love520_yuan 2024-09-12 17:49 采纳率: 42.9%
浏览 3
已结题

C++ 指针越界导致崩溃

有一个很旧的MFC程序中使用 std::map<int, void *> _mapClientData保存界面列表中显示的一些数据客户相关的结构体信息,这个_mapClientData的 void * 保存的结构体中有一个字段也是类似的 std::map<int, void *> _mapClientUserData,保存这个节点中所有的用户的信息。
现在在界面上显示,程序中 new 了一个新的结构体数组指针指向 _mapClientUserData 中指向的数据,然后把这个数据传给界面显示函数,由于MFC的界面消息机制,在临界区内调用可能引起阻塞,所以这个 new 的指针所指的内容可能在绘制界面的时候被 _mapClientData erase 销毁整个客户端信息的时候(客户端退出了)销毁掉,导致指针越界崩溃。
这个问题该怎么修改?使用智能指针的方式是否可行?可行的话能否给个大致的修改思路?

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-12 17:50
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你遇到的问题是由于指针管理和生命周期问题导致的。使用裸指针在C++中很容易引发这类问题,特别是在涉及多线程和动态内存管理的情况下。为了解决你描述的问题,你可以考虑使用智能指针来管理内存,特别是std::shared_ptr,它可以自动管理对象的生命周期,并且可以在多个智能指针之间共享所有权。以下是修改思路的大致步骤:

    1. 定义结构体的智能指针类型:首先,为每个结构体定义相应的智能指针类型。这可以通过创建一个继承自std::shared_ptr的类或使用标准的std::shared_ptr来完成。这样做的好处是当智能指针超出作用域或被重置时,它会自动删除它所拥有的对象。

    例如:

    using ClientDataPtr = std::shared_ptr<ClientDataStruct>; // ClientDataStruct是结构体的名称
    using ClientUserDataPtr = std::shared_ptr<ClientUserDataStruct>; // ClientUserDataStruct是另一个结构体的名称
    
    1. 更新你的映射容器:使用新的智能指针类型更新你的映射容器_mapClientData和结构体中的_mapClientUserData。这样,当映射中的元素被删除时,相关的内存会自动释放。

    例如:

    std::map<int, ClientDataPtr> _mapClientData; // 使用智能指针代替void指针保存结构体的信息
    // 并且在ClientDataStruct中使用同样的智能指针来存储ClientUserDataStruct的实例
    
    1. 更新你的代码逻辑:确保正确地管理智能指针的生命周期。当添加新的结构体实例到映射容器时,使用std::make_shared来创建智能指针,而不是直接使用new关键字。在需要释放内存时,确保不再使用已删除的智能指针。使用智能指针的引用计数特性可以避免双重删除的问题。此外,还需要注意线程安全问题,确保在多线程环境中正确地同步访问映射容器。

    这是一个大致的修改思路。具体的实现细节可能会根据你的代码结构和需求有所不同。使用智能指针是一个很好的做法,因为它可以帮助你避免许多与裸指针相关的常见问题。同时,确保在多线程环境中正确同步访问共享资源也是很重要的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月21日
  • 已采纳回答 9月13日
  • 创建了问题 9月12日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见