1. 智能指针
c++中,使用普通的指针可能会造成内存泄露,这可能是由于忘了delete,或者是程序提前return导致没法delete,例如:
void foo()
{
myClass* ptr = new myClass;
if (true)
return;
delete ptr; //无效的delete,因为函数已经return
}
因此我们想,最好指针自己能够在不需要的时候就自动delete,这就叫智能指针(smart pointer). c++中,能够实现”自动delete指针“的,就是class里的destructor了。所以一个想法就是:构造一个关于智能指针的class:
template<class T>
class auto_Pointer
{
private:
T* my_ptr;
public:
auto_Pointer(T* ptr=nullptr)
:my_ptr(ptr)
{
}
~auto_Pointer()
{
delete my_ptr;
}
//overload指针的“*”和“->"操作
T& operator*() const {
return *my_ptr;}
T* operator->() const {
return my_ptr;}
};
然后试一下:
class myClass
{
public:
myClass()
{
cout << "myClass constructed" << endl;
}
~myClass()
{
cout << "myClass destructed" << endl;
}
};
int main()
{
auto_Pointer<myClass> ptr(new myClass);
if (true)
{
cout << "if testing" << endl;
return 0;
}
return 0;
}
main函数输出:
myClass constructed
if testing
myClass destructed
在main中没有显式地delete指针,但实际上是这么做了的。对比一下用普通指针的情况:
int main()
{
myClass *ptr = new myClass();
if (true)
{
cout << "if testing" << endl;
return 0;
}
delete ptr;
return 0;
}
结果是:
myClass constructed
if testing
程序也能报错,但实际上ptr是没有被delete的,这就会有内存泄露的风险。
以前c++有auto_ptr智能指针,c++11不用这个了,现在两大智能指针是shared_ptr和unique_ptr.
2. move语义
上面智能指针很好地解决了内存管理的问题,但还是会有问题。考虑下面例子:
int main(