智能指针
- 在java中如果在堆上开辟内存是不需要手动释放的,我们叫做智能指针;但是在C++中如果用new在堆上开辟了空间,我们需要用delete进行手动释放,否则造成内存泄露。
- 在C++中,已提供基于模板的智能指针操作,通过#include<memory>:
auto_ptr<int> ptr(new int); // int* ptr= new int;
auto_ptr其实是一个类, ptr定义了一个对象
- 智能指针的实现:
class A
{
public:
A(int a)
{
this->m_a = a;
cout << "A()" << endl;
}
void Print()
{
cout << "a: " << m_a << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int m_a;
};
template<class TYPE_>
class Auto_Ptr
{
public:
Auto_Ptr(TYPE_* ptr)
{
m_ptr = ptr;
}
TYPE_* operator->()
{
return m_ptr;
}
TYPE_& operator*()
{
return *m_ptr;
}
~Auto_Ptr()
{
if (m_ptr != NULL)
{
delete m_ptr;
m_ptr = NULL;
}
}
private:
TYPE_* m_ptr;
};
int main()
{
Auto_Ptr<A> my_ptr = new A(10);
my_ptr->Print(); // my_ptr.m_ptr ->Print();
(*my_ptr).Print(); //(*my_ptr.m_ptr)->Print();
} //main函数结束将自动触发 A的析构,不需要手动释放