cpp的智能指针
智能指针是利用了构造函数分配内存,利用析构函数自动掉的特性释放内存
智能指针可以解决一些内存不释放的问题
智能指针实现的例子
template <typename T>
class MySmartPointer {
private:
T *m_pointer;
public:
MySmartPointer(T *pdata):m_pointer(pdata){}
~MySmartPointer(){delete m_pointer;};
T& operator*()const{
return *(m_pointer);
}
T* operator->()const{
return m_pointer;
}
};
智能指针的类型
管理内存资源是智能指针与众不同的地方。
简单的实现可能会导致性能问题,最快的实现又可能不适合项目
智能指针的分类
深度复制
写时复制
引用计数
引用链接
破坏性复制
深度复制
在实现深度复制的智能指针中,每个智能指针都保存一个它管理的对象的完整副本。
当智能指针被复制时,也将复制它指向的对象。当智能指针离开作用域时,将释放它指向的内存。
缺点是效率不高。可以避免切片
class Animal{
public:
string name;
Animal(){name = "animal";};
virtual ~Animal(){}
virtual void talk(){
cout << "Animal talk" << endl;
}
};
class Dog:public Animal{
public:
Dog(){name = "dog";}
~Dog(){}
virtual void talk(){
cout << "Dog talk" << endl;
}
};
class Cat:public Animal{
public:
Cat(){name = "cat";}
~Cat(){}
virtual void talk(){
cout << "Cat talk" << endl;
}
};
void makeAnimalTalk(Animal manimal){
cout << manimal.name << endl;
manimal.talk();
}
void tsmartPoint(){
cout << "smart pointer" << endl;
//深度切片
Cat mcat;
makeAnimalTalk(mcat);
Dog mdog;
makeAnimalTalk(mdog);
}
以上代码都是输出 animal talk.
使用深度切片可以避免这个问题
写时复制机制
视图对深度复制的性能进行优化,它共享指针,知道首次写入对象。
引用计数智能指针
记录对象的用户的数量的机制,当计数降低到0后,便释放对象。
引用链接智能指针
引用链接智能指针不主动维护,只要知道计数为0便自动释放。
破坏性复制
在智能指针被复制时,将所有权交给目标指针,并重置原来的指针。
cpp标准库提供的auto_ptr
基于破坏性复制指针
//标准库提供的破坏性指针
class SomeClass{
public:
SomeClass(){cout << "SomeClass constructed" << endl;}
~SomeClass(){cout << "SomeClass destructed" << endl;}
void saySome(){cout << "SomeClass:hello boy" << endl;;}
};
void usePointer(auto_ptr<SomeClass> ap){
ap->saySome();
}
void usePointer(){
cout << "usePointer" << endl;
auto_ptr<SomeClass> ap1(new SomeClass());
usePointer(ap1);
ap1->saySome();
}
常用的智能指针库
boost