您的位置:首页 > 大数据 > 人工智能

56 RAII实现智能指针

2016-04-05 12:07 288 查看
空悬指针

内存泄漏

重复释放

//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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  智能指针