`

封装智能指针

阅读更多

测试代码

#include "stdafx.h"
#include "SmartPt.h"
#include <iostream>
using namespace std;

class A
{
public:
	A(int nVal = 0)
	{
		m_nVal = nVal;
		cout << "A::A()" << endl;
	}

	~A()
	{
		cout << "A::~A()" << endl;
	}

public:
	void Print()
	{
		cout << "A::Print(): value=" << m_nVal << endl;
	}

private:
	int m_nVal;
};

class B
{
public:
	B()
	{
		cout << "B::B()" << endl;
	}

	~B()
	{
		cout << "B::~B()" << endl;
	}

public:
	void Test()
	{
		cout << "B::Test()" << endl;
	}
};

int main()
{
	CSmartPt<A> pa(new A);
	CSmartPt<B> pb(new B);
	CSmartPt<int> pn(new int[100]);

	pa->Print();
	pb->Test();

	for (int i = 0; i < 100; i++)
	{
		pn.Get()[i] = i;
	}

	cout << "Print contents of int arrray.." << endl;
	for (int i = 0; i < 100; i++)
	{
		cout << pn.Get()[i] << "\t";
	}
	cout << endl;

	A* pa1 = new A(123);
	pa.Set(pa1);
	pa->Print();

	A* pa2 = new A(234);
	pa = pa2;

	return 0;
}
 

智能指针源代码

#pragma once
#include <Windows.h>

template <class T>
class CSmartPt
{
public:
	CSmartPt(T* t)
	{
		m_pData = t;
	}

	~CSmartPt(void)
	{
		Release();
	}

public:
	BOOL Release()
	{
		if (!m_pData)
		{
			return FALSE;
		}

		delete m_pData;
		m_pData = NULL;

		return TRUE;
	}

	T* Get() const
	{
		return m_pData;
	}

	BOOL Set(T* t)
	{
		if (t == m_pData)
		{
			return FALSE;
		}

		Release();

		m_pData = t;

		return TRUE;
	}

public:
	T& operator * () const
	{
		return *m_pData;
	}

	T* operator -> () const
	{
		return m_pData;
	}

	T* operator = (T* t)
	{
		Set(t);
		return m_pData;
	}

	CSmartPt* operator = (CSmartPt* p)
	{
		Set(p->Get());

		return this;
	}
	
private:
    T*	m_pData;
};
 
分享到:
评论

相关推荐

    smartptr——基于自动引用计数的智能指针

    智能指针相信大家听说过吧,我理解的智能指针,既是一个C++模板类,重载了指针操作符(-&gt;)和(*)操作符,而使它的实例可以"用指针的形式去调用"。 它可以接管任意类型的指针,所以你只需要放心大胆的new出任意对象...

    配置文件操作类封装及智能指针实现

    配置文件操作类封装及智能指针实现,具体操作可查看readme或者查看源码即可

    C++ 引用计数技术及智能指针的简单实现

     简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值,则通过另一对象...

    简单的智能指针实现

    简单的智能指针的实现代码,有详细的注释及说明

    智能指针与弱引用详解

    智能指针是c++ 中的一个概念,因为c++ 本身不具备垃圾回收机制,而且指针也不具备构造函数和析构函数,所以为了实现内存( 动态存储区) 的安全回收,必须对指针进行一层封装,而这个封装就是智能指针,其实说白了,...

    C++智能指针的原理和实现.pdf

    C++智能指针的原理和实现 智能指针的原理和实现 ⼀、智能指针起因 ⼀、智能指针起因 在C++中,动态内存的管理是由程序员⾃⼰申请和释放的,⽤⼀对运算符完成:new和delete。 new:在动态内存中为对象分配⼀块空间并...

    Qt源码剖析-智能指针.pdf

    智能指针是使⽤RAII技术(惯⽤⼿法)对裸指针进⾏封装、隔离、管理。 2. 把堆对象转移为栈对象。 为什么使⽤ 为什么使⽤QT智能 智能(smart)指针? 指针? CPP中在使⽤堆内存时我们必须使⽤指针,使⽤指针给我带来便利...

    c++11智能指针

    智能指针类对象封装了自动释放内存的功能 从而避免内存泄漏 例如 void remodel(std::string & str) { std::string * ps = new std::string(str); //str = ps; return; //内存泄漏 } void remodel1(std::string &...

    C++智能指针(1).pdf

    智能指针主要⽤于管理在堆上分配的内存,它将普通的指针封装为⼀个栈对象。当栈对象的⽣存周期结束后,会在析构函数中释放掉申请的 内存,从⽽防⽌内存泄漏。简要的说,智能指针利⽤了 C++ 的 RAII 机制,在智能...

    【C++ 深入浅出】智能指针shared_ptr、unique_ptr、weak_ptr详解

    智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++ 11中最常用的智能指针类型为shared_ptr,它采用引用...

    C++智能指针

    智能指针的封装 不会的同学可以参考 或者直接使用

    C++ 智能指针的模拟实现实例

    主要介绍了C++ 智能指针的模拟实现实例的相关资料,智能指针是一个类,它把普通指针封装起来,能实现和普通指针同样的功能。,需要的朋友可以参考下

    C++仿写指针指针(auto-ptr,unique-ptr,shared-ptr,weak-ptr)

    智能指针其实是一个类,是对普通指针进行了封装,将其作为参数传入智能指针的构造函数实现绑定。只不过通过运算符重载让它“假装”是一个指针,也可以进行解引用等操作。既然智能指针是一个类,对象都存在于栈上,...

    ADO C++封装类

    一个ADO的封装类。封装了VC++中的三个智能指针。头文件中有使用说明

    C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)

    之前,为了处理程序中的异常情况,往往需要将指针手动封装到类中,通过析构函数来释放动态分配的内存;现在这一过程就可以交给shared_ptr去做了。 一般我们使用make_shared来获得shared_ptr。 cout&lt;&lt;"test ...

    【cmake实战十一】com组件方法的简单实现

    博客【cmake实战十一】com组件方法的简单实现 中的demo 博客地址:... 1.组件必须动态连接; 2.组件必须隐藏(或封装)其内部实现细节。 3.基类智能指针转换为派生类的智能指针使用dynamic_pointer_cast

    C++复试和面试题汇总

    C++增加了 const 常量、引用、强制类型转换、智能指针、Lambda 匿名 函数、右值引用等新特性,功能语法更为灵活复杂; • C++可复用性高,引入了模板概念,在此基础上实现了 STL 标准模板库, 大大方便了开发...

    C++开发面试知识点-C、C++、C++11、C++14

    自己秋招根据面经和基础.../ 继承 / 多态、引用 & 指针、重载与重写、右值引用、智能指针、整形字面量...... 对于C/C++/C++11/C++14的内容都有涉及,但肯定没法做到100%知识点全覆盖,可以根据自己需要后续添加内容。

    常用的实用工具类库和常用函数等

    智能指针,循环队列,循环缓存区,线程封装等

    C++面试常问知识点总结

    C++更加安全,增加了const常量、引用、四类cast转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)、智能指针、try—catch等等; C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便...

Global site tag (gtag.js) - Google Analytics