shared_ptr智能指针会自动释放数组所占用的内存空间吗?
问题本质
当通过shared_ptr<double> p(new int[10]);这种方式让shared_ptr接管数组内存时,会引发内存泄漏。原因是shared_ptr的默认析构逻辑是调用delete而非delete[]——这只会释放数组第一个元素的内存,剩余元素对应的空间无法被正确回收。
你提供的Matrix构造函数代码:
Matrix::Matrix(size_t m, size_t n) { shared_ptr<double> data_(new double[m * n]); m_ = m; n_ = n; }
同样存在这个问题:new double[m * n]分配的是连续的数组内存,但shared_ptr默认用delete释放,导致除第一个double外的其他内存块都无法被正确回收,造成内存泄漏。
正确的处理方式
要让shared_ptr正确管理数组内存,有两种可靠方案:
- 方案一:手动指定删除器,让shared_ptr调用
delete[]完成释放shared_ptr<double> data_(new double[m * n], [](double* ptr) { delete[] ptr; }); - 方案二:使用C++17及以后标准支持的shared_ptr数组特化版本(如果不需要共享所有权,使用
std::unique_ptr<T[]>会更高效)shared_ptr<double[]> data_(new double[m * n]);
内容的提问来源于stack exchange,提问作者Lionnel104
相关产品推荐
相关产品推荐

