直接上代码:
#include "stdafx.h"
#include <memory>
class Base
{
// 没有虚析构函数
};
class Derived : public Base
{
public:
Derived() = default;
Derived(int int_) : i_(int_) {}
~Derived() {
int i = 0;
}
int i_{ 0 };
};
int main()
{
{
Derived* sub_ptr = new Derived(123); // shared_ptr 可以调用到Derived的析构函数
//Base* sub_ptr = new Derived(123); // shared_ptr 将调用不到Derived的析构函数, 造成内存泄漏!!!
std::shared_ptr<Base> base_ptr(sub_ptr);
}
return 0;
}
Derived* sub_ptr = new Derived(123); // shared_ptr 可以调用到Derived的析构函数 的实现:
1 通过模板构造函数,编译器已知指针的具体子类型,
template<class _Ux>
explicit shared_ptr(_Ux *_Px) // 此处