一步一步 实现智能指针(一)

来源:互联网 发布:三菱触摸屏软件 编辑:程序博客网 时间:2024/06/01 21:37

一。.为什么需要智能指针

C++的指针使用容易出错。

比如:new,之后忘了delete。

一个类中如果包含了指针成员。在对象使用时容易造成悬挂指针的错误。

class TestPtr
{
public:
TestPtr(int*p):ptr(p){}
~TestPtr(){delete ptr;}
private:
int*ptr;
};
int main ()
{
TestPtr test1;

TestPtr  test2 =test1; //(拷贝)

TestPtr test3;

test3 = test1; //赋值

}

在这种情况下,类TestPtr对象的任何拷贝、赋值操作都会使多个TestPtr对象共享相同的指针。但在一个对象发生析构时,指针指向的对象将被释放,从而可能引起悬垂指针

二、分析过程

按照软件开发的基本原则,分层,封装。

因为c++ 语法上的指针 容易出错,所以就将其封装。

解决三个问题,

1.new,delete 成对

2.不提前释放delete。

3.外在表现指针的行为。

4.其他比如线程安全等等高级问题。不在此讨论。

三.实现 需要用的 技术原理

问题1.

这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存

问题2

使用一个变量标示。

每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)

问题3 

操作符重载

所有的智能指针都会重载 -> 和 * 操作符


0 0
原创粉丝点击