传统指针存在一些问题:
需要手动管理内存、容易发生内存泄漏(忘记释放、出现异常等 释放之后产生野指针
智能指针就是为了解决传统智能指针存在的问题
auto_ptr
存在缺陷,现在已经被弃用
share_ptr
//智能指针p是在栈空间
//auto_ptr 不能用于数组,此处有异常
SmartPointer<Person> p(new Person[10]);
p->run();
shared_ptr<Person[]> p(new Person[10]);
智能指针的自实现
//智能指针的自实现
#include <iostream>
using namespace std;
class Person
{
private:
int m_age;
public:
Person(int age):m_age(age)
{
cout << "Person(int):" << m_age << endl;
}
void run()
{
cout << "run():" << m_age << endl;
}
~Person()
{
cout << "~Person()" << endl;
}
};
template <class T>
class SmartPointer
{
private:
T* m_obj;
public:
SmartPointer(T* obj) :m_obj(obj) {}
~SmartPointer()
{
//保证了在SmartPointer销毁的时候指向的内存空间也能释放
if (m_obj == nullptr) return;
delete m_obj;
}
//重载运算符,让智能指针对象p可以调用Person的run函数
T* operator->()
{
return m_obj;
}
};
int main()
{
{
//智能指针p是在栈空间
SmartPointer<Person> p(new Person(20));
p->run();
}
return 0;
}
思考下面的代码有没有问题:
分析:出现二次析构!