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
相关产品推荐
相关产品推荐

