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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:32:33