c++,关于内存泄漏的一个问题

查看:128
本文介绍了c++,关于内存泄漏的一个问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

class Base{
}; 
class Derived : public Base{
public:
    int *a;
    Derived(){
        a = new int;
    }
    ~Derived(){
        delete a;
    }
};

Derived *d = new Derived ;
Base *b = d;
shared_ptr<Base> bb(b); // 会造成内存泄漏,因为没有虚析构函数

Derived *d = new Derived ;
shared_ptr<Base> bb(d); // 这种情况就不会有内存泄漏了,为何?难道这里存进去的d没有被upcast?

解决方案

1, 在shared_ptr<base>里实际保存d的是一个derived*指针,shared_ptr的声明类似如下:

template <typename Tp>
class shared_ptr{
public:
    template <typename Tp1>
    explict shared_ptr(Tp1* p) : holder(p){}
    //...
};

holder是根据p的实际类型决定的。所以不会发生内存泄漏。

2, 为什么会这样,我也不知道,shared_ptr.h代码里就是这样写的。

3, 其实偷偷告诉你,换成unique_ptr的话是会泄露的,我个人建议不要依赖这些行为,
如果要cast请参考std::dynamic pointer cast

这篇关于c++,关于内存泄漏的一个问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆