SmartPointerTemplateClass

智能指针是一个行为类似指针类对象.

一定要明确这一点,智能指针是一个模板类,所以在构造的时候不能直接初始化,需要通过构造函数来进行构造与实现

思想

除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。

比如以以下函数为例

1
2
3
4
5
6
7
void remodel(std::string & str)
{
std::string * ps = new std::string(str);
...
str = ps;
return;
}

这段代码存在一个缺陷,也就是每次在调用的时候,函数都分配堆中的内存,但从来不收回,所以会导致内存泄漏.但是只要在return前添加delete就行

但是要人不要忘掉添加delete其实还是挺痛苦的,而且还是会有别的问题.比如如下情况

1
2
3
4
5
6
7
8
9
10
void remodel(std::string & str)
{
std::string * ps = new std::string(str);
...
if (weird_thing())
throw exception();
str = *ps;
delete ps;
return;
}

一旦出现特殊情况,就会跳过delete语句,也会有内存泄漏的情况

所以,如果ps指针是一个对象,具有析构函数,那么该析构函数就会在ps过期的时候自动释放掉它指向的内存.

所以,如果这个指针是一个对象,就可以在过期的时候删除指向他的内存. 这就是智能指针的思想

常规指针和智能指针的异同

1
2
3
4
5
6
void demol()
{
double * pd = new double; // #1
*pd = 25.5; // #2
return; // #3
}

1
2
3
4
5
6
void demo2()
{
auto_ptr<double> ap(new double); // #1
*ap = 25.5; // #2
return; // #3
}

使用智能指针