尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
用 GoogleMock 触发内存检查失败而真实对象正常怎么排查:给基类加虚析构函数
用 GoogleMock 触发内存检查失败而真实对象正常怎么排查给基类加虚析构函数【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest用 GoogleTest/GoogleMock 写 C 测试时你会遇到这样一类堆检查器heap checker报错同一段业务代码依赖换成真实实现时测试正常一旦把依赖替换成 mock 对象堆检查器就报内存错误通常是泄漏。这类现象在 GoogleMock FAQ 里被单列成一问直接给出的排查方向是检查你正在 mock 的那个类通常是纯接口/基类是否声明了虚析构函数。下面按确认现象、定位根因、修复、验证的顺序给出这条排查路径。先确认现象属于这一类动手前先核对失败是否满足这组条件它决定了后文路径是否适用你在测试里 mock 了某个接口/基类并把它分配在堆上new出来的 mock 对象跑测试时堆检查器报内存错误把 mock 换成真实实现后同一个测试就正常通过。满足这三点再按基类缺虚析构函数这条线查。如果换成真实对象也失败或者失败是断言失败而不是堆检查器报错问题就在别处不在本路径范围内。一个容易混淆的相邻原因值得先排除ASSERT_*断言失败会立即从当前函数返回可能跳过后面的清理代码而留下空间泄漏。文档提醒当你在断言失败之外还看到堆检查器报错时要留意这一点见 primer。也就是说堆检查器报错不一定都指向本文的根因需先区分。检查被 mock 的基类是否有虚析构函数FAQ 给出的第一个排查动作是确认被 mock 的类有没有虚析构函数并强调一条通用规则Whenever you derive from a base class, make sure its destructor is virtual. Otherwise Bad Things will happen.即凡是会被继承的基类其析构函数都应当是virtual。文档用下面这段代码文档示例说明问题所在class Base { public: // Not virtual, but should be. ~Base() { ... } ... }; class Derived : public Base { public: ... private: std::string value_; }; ... Base* p new Derived; ... delete p; // ~Base() will be called, but ~Derived() will not // - value_ is leaked.关键在最后几行通过基类指针p删除一个Derived对象时因为~Base()不是虚函数只有~Base()被调用~Derived()不会被调用于是Derived的成员value_这里是一个std::string没有被释放堆检查器据此报泄漏。mock 对象本质上是它所 mock 的接口的一个派生类。当你用接口基类指针持有并删除它时走的正是上面这条派生类析构函数不被调用的路径所以会暴露基类缺虚析构函数的问题。文档还在多处对析构函数不是虚函数给出一致提醒可作为定位时的交叉印证在你准备让别的类继承的任何类上析构函数都必须是虚函数否则通过基类指针删除对象时派生类析构函数不会被调用会得到内存泄漏这类损坏的程序状态见 GoogleMock for dummies。NiceMockT与StrictMockT在T的析构函数不是虚函数时可能无法正常工作见 NiceMock / StrictMock 参考 与 GoogleMock cook book。修复给基类析构函数加 virtual修复动作很小把基类的析构函数声明改成虚函数。以 FAQ 的示例为例把上面的~Base()改成class Base { public: virtual ~Base() { ... } ... };FAQ 给出的成功判定就是这一句By changing~Base()to virtual,~Derived()will be correctly called whendelete pis executed, and the heap checker will be happy.也就是说delete p执行时会正确调用~Derived()之前被跳过的成员释放随之发生堆检查器不再报错。验证先确认测试里确实开着堆检查器。文档提示当你在堆上分配 mock 对象时最好在测试里打开堆检查器如果你已经在用gtest_main库这一点会自动具备见 GoogleMock for dummies。改完基类析构函数后重跑测试堆检查器不再报该 mock 对象相关的内存错误即为修复成功。如果该基类同时被NiceMock/StrictMock包裹修复后这两处可能无法正常工作的提示也随之消除。适用边界本路径只处理mock 对象触发堆检查失败、真实对象正常且根因指向被 mock 基类缺虚析构函数的情况现象不符合这一组条件时不要套用。文档没有给出某个具体平台/工具下如何打开堆检查器的命令只说明使用gtest_main会自带这一点。你实际采用哪种堆检查器需按自己环境确定文档不作指定。【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Label Studio Enterprise 2.24.0 版本解析:暗色模式、全新首页、标注员评估与安全加固实战指南

Label Studio Enterprise 2.24.0 版本解析:暗色模式、全新首页、标注员评估与安全加固实战指南

Label Studio Enterprise 2.24.0 版本解析:暗色模式、全新首页、标注员评估与安全加固实战指南 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/…

📅 2026/9/12 2:47:08
BFGS与Armijo线搜索的MATLAB实现:从数学原理到代码实战

BFGS与Armijo线搜索的MATLAB实现:从数学原理到代码实战

我先说下这个项目给我的感觉吧。做优化算法的人,手上一般都会备着几套经典无约束优化方法的代码,梯度下降、牛顿法这些当然要有,但真正在工程里遇到非凸目标、二阶信息算不出来或者算出来不太靠谱的时候,BFGS几乎是默认的备选方案…

📅 2026/9/12 2:47:08
React Bits Texture Lab 通过 URL 加载图片后导出和复制被禁用怎么排查

React Bits Texture Lab 通过 URL 加载图片后导出和复制被禁用怎么排查

React Bits Texture Lab 通过 URL 加载图片后导出和复制被禁用怎么排查 【免费下载链接】react-bits An open source collection of animated, interactive & fully customizable React components for building memorable websites. 项目地址: https://gitcode.com/GitH…

📅 2026/9/12 2:47:07
MORE NEWS

更多资讯

📰

STM32驱动绝对值编码器:从时序解析到多圈标定与滤波实践

简介:面向STM32开发者的绝对值编码器应用资源,整合了基于HAL库的完整工程示例,适合需要精确位置反馈、电机定位与运动控制的嵌入式工程师参考。压缩包共78个文件,以C/C源码头文件为主,辅以启动文件、Keil工程与配置文件…

📰

Mask R-CNN结合char_cnn的停车场车牌识别系统设计与实践

简介:基于Mask R-CNN训练模型与PyQt开发的车牌识别系统完整项目源码,面向人工智能、通信工程、自动化、电子信息等专业的在校生和开发者,适用于毕业设计、课程设计或项目初期演示。项目包含可运行的图形界面、模型权重、车牌数据集与标注文件…

📰

打造STM32舵机库:STS3215串口帧协议与半双工总线控制

简介:针对飞特舵机STS3215的控制库文件,面向机器人、无人机及其他自动化设备开发者,意在简化舵机驱动开发与底层通信管理。压缩包共4个文件,包含2个C源码和2个头文件:源码负责协议解析、指令发送等功能实现&#xff0c…

📰

34mm SiC功率模块:新能源系统高效化与小型化的物理基准

1. 项目概述:为什么34mm SiC模块正在成为新能源系统里的“心脏级”器件最近在几个光伏逆变器客户现场做技术复盘时,反复被问到一个问题:“你们说的‘基本半导体全系34mm SiC模块’,到底和我们原来用的62mm IGBT模块、甚至市面上常…

📰

分岔系统特征提取与MPC自适应控制实战

简介:本资源是一套面向数学、电子信息工程及计算机专业本科生的分岔动态系统预测控制参数特征分析MATLAB仿真代码集,聚焦非线性系统建模与关键参数敏感性识别问题,适用于课程设计、期末大作业及毕业设计等实践环节。压缩包共394个文件&#x…

📰

机动目标跟踪中运动模型失配的本质与IMM解决方案

简介:本资源是一份面向雷达/导航系统开发与目标跟踪算法学习者的MATLAB仿真程序,聚焦于机动目标(含匀速、转弯、加速等多阶段运动)的建模与滤波跟踪问题。适用于自动控制、信号处理、无人系统感知等方向的本科生高年级课程设计、研…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬