C++17中如何为含std::unique_ptr<double[]>成员的类编写析构函数
你完全不需要手动编写这个析构函数!
嘿,别纠结啦,std::unique_ptr<double[]> 这种数组特化的智能指针,本身就已经帮你搞定了内存释放的事儿,根本不需要你手动写析构函数。
原因很简单:
- 当你用
std::make_unique<double[]>(size)初始化arr_的时候,unique_ptr已经识别出这是数组类型,它的默认删除器会自动调用delete[]来释放内存,而非普通的delete。 - 编译器会为你的
test类自动生成默认析构函数,这个默认析构函数会调用arr_的析构函数,进而自动释放数组占用的内存。
你的代码可以直接简化成这样:
#include <memory> // 别忘了包含这个头文件 class test{ public: test(int size) : size_{size}, arr_{std::make_unique<double[]>(size)} {} // 删掉手动写的析构函数,啥都不用加! private: int size_; std::unique_ptr<double[]> arr_; };
再给你澄清几个误区:
- 你觉得
delete关键字没用是对的,这里手动调用delete或者delete[]反而会出问题——比如如果你写了delete[] arr_.get(),会导致双重释放,因为unique_ptr在自己的析构函数里还会再执行一次内存释放。 get_deleter()确实只针对自定义删除器的场景,比如你用了特殊的内存分配方式(比如用malloc分配的内存,需要用free释放),才需要自定义删除器并调用它,这里完全用不上。
放心用吧,智能指针的核心价值就是帮你自动管理内存,不用再手动写delete啦~
内容的提问来源于stack exchange,提问作者Athos
相关产品推荐
相关产品推荐

