c++,关于内存泄漏的一个问题
黄舟
黄舟 2017-04-17 13:56:32
0
1
315
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)
PHPzhong

1, 在shared_ptr裡實際保存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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板