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; }
相关文章推荐