跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组
折叠
品牌标识

D2Learn Forums

  1. 主页
  2. General Discussion | 综合讨论
  3. 析构函数为何会调用

析构函数为何会调用

已定时 已固定 已锁定 已移动 已解决 General Discussion | 综合讨论
c++基础
3 帖子 2 发布者 58 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • CS-liujfC 离线
    CS-liujfC 离线
    CS-liujf
    写于 最后由 编辑
    #1
    class A
    {
    public:
        ~A() { std::cout << "A" << std::endl; }
    };
    
    class B : public A
    {
    public:
        ~B() { std::cout << "B" << std::endl; }
    };
    
    template <typename T>
    class MySharedV2
    {
    public:
        template <typename T2>
        MySharedV2(T2 *p)
        {
            data_ = p;
            deleter_ = [p](){ delete p;};
        }
        ~MySharedV2()
        {
            deleter_();
        }
        T* operator->()
        {
            return data_;
        }
    private:
        std::function<void()> deleter_;
        T* data_ = nullptr;
    };
    
    int main(){
        MySharedV2<A> ptr(new B());
    }
    

    对于上述代码,B的析构函数被调用我能理解,因为MySharedV2的析构函数会调用B的析构函数,但A的析构函数为什么也会被调用,是什么地方调用的它?

    1 条回复 最后回复
    1
    • CS-liujfC 离线
      CS-liujfC 离线
      CS-liujf
      写于 最后由 编辑
      #2

      我明白了,如此写等价于直接delete B类型指针,当然会调用A的析构函数

      sunrisepeakS 1 条回复 最后回复
      1
      • sunrisepeakS 离线
        sunrisepeakS 离线
        sunrisepeak d2learn-dev
        在 回复了 CS-liujf 最后由 sunrisepeak 编辑
        #3

        @CS-liujf 这里T2推导的应该是B类型

        1 条回复 最后回复
        0
        • sunrisepeakS sunrisepeak 将这个主题标记为已解决,在

        • 登录

        • 没有帐号? 注册

        • 登录或注册以进行搜索。
        d2learn forums Powered by NodeBB
        • 第一个帖子
          最后一个帖子
        0
        • 版块
        • 最新
        • 标签
        • 热门
        • Online Tools
        • 用户
        • 群组