关于C++ Boost库智能指针与删除器使用正确性的问询
问题解答
两种写法的正确性判断
第一种写法(未指定
free删除器)是错误的
你用memalign分配的内存属于C标准库管理的堆内存,必须用free释放,但boost::shared_array的默认删除器是delete[](专门针对new[]分配的数组内存)。用delete[]去释放memalign分配的内存属于未定义行为——程序没报错只是巧合,实际运行可能出现崩溃、内存泄漏、数据损坏等不可预测的问题。第二种写法(指定
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
相关产品推荐
相关产品推荐

