今天学了链表,在堆上手动开辟并赋值后可以正常运行,但是最后提示警告:取消对NULL指针“node”的引用,实在想不到是哪里有问题,求助各位大佬,还是个新手,请各位轻喷
通常致使程序崩溃的最重要缘由之一就是试图解引用NULL指针。正如上几篇文章中所说的,智能指针RefCountPtr和ScopedPtr提供了运行时的诊断。可是,并非全部的指针都是拥有某个对象全部的智能指针。所以为了对试图解引用一个不具备对象全部权的指针的行为进行诊断,引入一种并不删除它所指向的对象的“半智能”指针。例如,以下代码示例:函数
尽管出现了操做符=,但它并非告诉编译器当咱们试图把一个Ptr<T>赋值给另外一个Ptr<T>时该怎么作的赋值符。若是咱们为这个类编写一个赋值操做符,它应该被声明为以下这种形式:this
注意在前面这个类中,操做符=具备不一样的签名:它的右边有一个原始指针p。所以,这个类让编译器为Ptr<T>建立拷贝构造函数和复制操做符。因为Ptr<T>类的拷贝构造函数和赋值操做符都是容许出现的,所以,咱们能够自由复制这些指针,或者把它们做为函数的返回值等 。 若是想建立一个行为与const
MyClass*类似的半智能指针,只能像下面的作法同样:
注意,试图经过这个指针调用一个很是量函数将将没法经过编译,这意味着它正确的表现了常量指针的行为。
对于Ptr<T>模板指针具备如下特性:指针
(1)它并不拥有它所指向的对象的全部权,应该做为相同状况下原始指针的替代品;code
(2)它默认被初始化为NULL;对象
(3)它提供了运行时诊断,当它自己为NULL时,若是对它进行调用,就能够对这种行为进行检测。ci
-
若是指针拥有它所指向的对象的全部权,就使用智能指针
-
若是是不拥有所指向的对象的全部权的原始指针T*,就用模板类Ptr<T>取而代之