空悬指针
内存泄漏
重复释放
//Node.h
#ifndef _NODE_H_
#define _NODE_H_
class Node
{
public:
Node();
~Node();
void Calc() const;
};
class NodePtr
{
public:
explicit NodePtr(Node* ptr = 0)
:ptr_(ptr){}
NodePtr( NodePtr& other)//拷贝构造函数
:ptr_(other.Release()){}
~NodePtr(){ delete ptr_; }
NodePtr& operator=(NodePtr& other)
{
Reset(other.Release());
return *this;
}
Node& operator*() const{ return *Get(); }//返回引用,不会调用拷贝构造函数
Node* operator->() const{ return Get(); }
Node* Get() const{ return ptr_; }
Node* Release()//释放所有权
{
Node* tmp = ptr_;
ptr_ = 0;
return tmp;
}
void Reset(Node* ptr = 0)
{
if (ptr_ != ptr)
{
delete ptr_;
}
ptr_ = ptr;
}
private:
Node* ptr_;
};
#endif;
//Node.cpp
#include <iostream>
#include "Node.h"
Node::Node()
{
std::cout << "Node ..." << std::endl;
}
Node::~Node()
{
std::cout << "~Node ..." << std::endl;
}
void Node::Calc() const
{
std::cout << "~Node::Calc ..." << std::endl;
}
//main.cpp
#include<iostream>
using namespace std;
#include "Node.h"
int main(void)
{
NodePtr np(new Node);
np->Calc();
NodePtr np2(np);
return 0;
}