在C++中,智能指针是一个非常重要的概念。因为C++的类动态分配的对象不能自动释放掉,需手动调用new运算符。当程序员大意时,或程序发生异常时,或许就会发生没有手动释放内存而造成内存泄露。
智能指针的定义:就是在一个类中,存在一个指向另一个类对象的指针,并通过对指针运算符(比如:->,*)的重载,就可以实现利用当前类的对象通过指针运算符来操纵另一个类的成员(就像另一个类的指针操作一样),并且,在析构函数中定义了delete操作,借助于变量的作用域,能够实现类对象空间的自动释放。
在C++ 11中,有智能指针的类:shared_ptr<T>.头文件是#include<memory>,可以看做是一个指针,可以用一个已有的智能指针初始化一个新的智能指针,这个时候,指针的use_count()函数的结果是2,类似与文件描述符的复制,没有复制对象,只是将对象的引用计数加1。
智能指针的定义:就是在一个类中,存在一个指向另一个类对象的指针,并通过对指针运算符(比如:->,*)的重载,就可以实现利用当前类的对象通过指针运算符来操纵另一个类的成员(就像另一个类的指针操作一样),并且,在析构函数中定义了delete操作,借助于变量的作用域,能够实现类对象空间的自动释放。
在C++ 11中,有智能指针的类:shared_ptr<T>.头文件是#include<memory>,可以看做是一个指针,可以用一个已有的智能指针初始化一个新的智能指针,这个时候,指针的use_count()函数的结果是2,类似与文件描述符的复制,没有复制对象,只是将对象的引用计数加1。
下面的代码是一个通用的智能指针类,可以帮助了解智能指针的原理。
#ifndef SMARTPTR_HPP
#define SMARTPTR_HPP
#include <stddef.h>
template <typename T>
class SmartPtr{
public:
SmartPtr(T *type = NULL);
void resetPtr(T *type);
const T *getPtr()const;
operator bool() const{
return ptr_ == NULL;
}
~SmartPtr();
T &operator*();
const T &operator*()const;
T *operator->();
const T *operator->()const;
private:
SmartPtr(const SmartPtr &);
void operator=(const SmartPtr &);
T *ptr_;
};
template <typename T>
inline SmartPtr<T>::SmartPtr(T *type)
:ptr_(type)
{}
template <typename T>
inline void SmartPtr<T>::resetPtr(T *type)
{
if(ptr_ != type){
if(ptr_ != NULL){
delete ptr_;
}
ptr_ = type;
}
}
template <typename T>
inline const T *SmartPtr<T>::getPtr() const
{
return ptr_;
}
template <typename T>
inline SmartPtr<T>::~SmartPtr()
{
if(ptr_ != NULL){
delete ptr_;
}
}
template <typename T>
inline T &SmartPtr<T>::operator*()
{
return *ptr_;
}
template <typename T>
inline const T &SmartPtr<T>::operator*() const
{
return *ptr_;
}
template <typename T>
inline T *SmartPtr<T>::operator->()
{
return ptr_;
}
template <typename T>
inline const T *SmartPtr<T>::operator->() const
{
return ptr_;
}
#endif /*SMARTPTR_H*/