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

C++17 shared_ptr自动处理delete[]失效,测试遇内存问题排查

问题原因与解决方法

你混淆了shared_ptr的普通特化和数组特化版本,这是导致问题的核心原因:

C++17中能自动调用delete[]的是**shared_ptr<T[]>**(数组特化版本),而非普通的shared_ptr<T>。

具体解释:

  • 普通的shared_ptr<int>(非数组类型),无论C++版本,默认删除器都是调用delete。如果你给它传入new[]分配的指针,必然会出现delete和new[]不匹配的问题,这就是valgrind报Mismatched free() / delete / delete []的原因。
  • C++17新增的shared_ptr<int[]>是专门针对数组的特化模板,它的构造函数会自动生成调用delete[]的删除器,和new[]完全匹配,不需要显式指定删除器。

正确代码示例:

// C++17及以上正确写法,自动用delete[]释放
shared_ptr<int[]> t1(new int[7]);

对比不同版本的写法:

  • C++17之前没有数组特化,必须显式指定删除器:
shared_ptr<int> t1(new int[7], default_delete<int[]>());

用正确的数组特化版本编译运行后,valgrind就不会再报释放不匹配的错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:36:08