You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码为何触发潜在内存泄漏警告?同风格代码地址输出不一致

问题解答

1. 内存泄漏警告的原因与实际泄漏情况

警告触发原因

Clang静态分析器检测到:通过new创建的Test类对象指针t,在程序结束前没有调用delete释放对应的堆内存,因此触发了clang-analyzer-cplusplus.NewDeleteLeaks类型的潜在内存泄漏警告。

是否真的存在内存泄漏

是的,确实存在内存泄漏。main函数中用new Test()在堆上分配了内存,但全程没有执行delete t;来主动释放这块内存。虽然程序退出后操作系统会回收进程占用的所有内存,但从C++内存管理的规范要求来看,这属于开发者未主动清理自身分配资源的明确内存泄漏场景。

2. 另一代码中param2地址不一致的原因

当前示例代码中,doSomethings函数接收的是指针的值拷贝,正常情况下不会出现地址不一致。但在功能更复杂的同风格代码中出现该问题,大概率是以下情况导致:

  • 函数内部修改了传入的指针变量:如果doSomethings函数里给myStructure指针重新赋值了新的内存地址(比如myStructure = new MY_STRUCTURE();),那后续访问myStructure->param2时就会指向新的内存区域,地址自然和外部不同。
  • 内存越界破坏了指针本身:复杂代码中可能存在内存越界操作(比如写入的数据超出MY_STRUCTURE结构体的内存范围),覆盖了main函数中myStructure指针的存储值,导致传入函数的指针已经不是原始的结构体地址;或者函数内的指针被越界操作修改,指向了其他内存区域。
  • 内存分配错误:如果另一代码也犯了当前示例的错误——用sizeof(pMY_STRUCTURE)而非sizeof(MY_STRUCTURE)分配内存,会导致分配的内存大小仅为指针的字节数(64位系统为8字节),远小于结构体实际大小。后续对结构体成员的赋值会触发内存越界,可能破坏栈/堆中的其他数据(包括指针本身),进而引发地址异常。

补充:当前示例代码的隐藏问题

当前代码中malloc( sizeof(pMY_STRUCTURE) )是错误写法,正确应该是malloc( sizeof(MY_STRUCTURE) )。pMY_STRUCTURE是指针类型,sizeof它得到的是指针的大小,而非结构体的实际内存占用,这会导致分配的内存不足,后续访问param2及之后的成员都会触发内存越界,属于C++未定义行为。


内容的提问来源于stack exchange,提问作者Mart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:52:05