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

关于C++ Boost库智能指针与删除器使用正确性的问询

问题解答

两种写法的正确性判断

  1. 第一种写法(未指定free删除器)是错误的
    你用memalign分配的内存属于C标准库管理的堆内存,必须用free释放,但boost::shared_array的默认删除器是delete[](专门针对new[]分配的数组内存)。用delete[]去释放memalign分配的内存属于未定义行为——程序没报错只是巧合,实际运行可能出现崩溃、内存泄漏、数据损坏等不可预测的问题。

  2. 第二种写法(指定free为删除器)是正确的
    这里明确告诉shared_array,管理的内存需要用free来释放,和memalign的分配方式完全匹配,内存会被正确回收,不会有问题。

智能指针删除器的正确用法

  • 严格匹配内存分配与释放方式

    • 用new分配单个对象:使用默认删除器delete(对应boost::shared_ptr)
    • 用new[]分配数组:使用默认删除器delete[](对应boost::shared_array)
    • 用C标准库函数(malloc/calloc/memalign等)分配内存:必须指定free作为删除器
    • 自定义分配器:要搭配对应的自定义释放函数作为删除器
  • Boost智能指针的删除器类型支持
    Boost的智能指针不仅支持普通函数指针(比如free),还支持函数对象、lambda表达式(C++11及以上)作为删除器。比如你也可以这么写:

    spArray.reset((int*)memalign(16, 100 * sizeof(int)), [](int* ptr) { free(ptr); });
    
  • 注意shared_ptr与shared_array的区别
    别搞混两者的默认删除器:shared_ptr默认用delete(处理单个对象),shared_array默认用delete[](处理数组),要根据你管理的内存类型选择对应的智能指针。

  • 避免未定义行为
    绝对不要混用分配和释放方式,比如new配free、malloc配delete[],这些操作都是C++标准明确的未定义行为,没有任何安全保障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:12:12