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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号