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

浏览:25日期:2023-04-28

问题描述

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:

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

相关文章: