`

封装智能指针

阅读更多

测试代码

#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;
};
 
分享到:
评论

相关推荐

    c++句柄,智能指针 指针间的区别

    智能指针类将指针变量作为成员变量封装起来,在智能指针类对象离开作用域时,会再析构的过程中完成指针的释放。例如,使用auto_ptr智能指针类,可以自动释放所指向的对象内存,避免了手动delete的麻烦。 句柄、智能...

    智能指针与引用计数详解

    智能指针是C++编程中一个非常重要的概念,它是一种自动管理内存的对象,用来封装原始指针,确保在适当的时候释放所指向的对象。在C++中,智能指针的主要作用是防止内存泄漏,通过自动地跟踪和管理对象的生命周期来...

    智能指针的简单实现

    智能指针是C++编程中一个非常重要的概念,它是一种对象,封装了原始指针,并在需要时自动管理所指向的对象的生命周期。智能指针的主要目的是解决C++中的内存管理和资源管理问题,防止因手动释放内存导致的内存泄漏...

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

    本主题主要关注如何封装配置文件操作类以及利用智能指针来实现资源的自动管理。下面将详细阐述这两个关键知识点。 首先,配置文件操作类封装是对读取、写入和管理配置文件过程的一种抽象和简化。常见的配置文件格式...

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

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

    C++中智能指针的设计和使

    - **可维护性**:使用智能指针可以提高代码的可维护性,因为资源管理逻辑被封装在一个单独的对象中,而不是分散在整个程序中。 #### 总结 通过上述分析可以看出,智能指针不仅提高了C++程序的健壮性和可靠性,还...

    智能指针的介绍和用法

    除了标准库和第三方库提供的智能指针,不同的公司也可能封装出适合自己项目的智能指针类。 本文所介绍的智能指针是基于CReferenced和CRefPtr两个类的实现。CReferenced类是一个引用计数实现类,它负责管理对象的...

    c++ 复制控制和智能指针

    6. 智能指针:智能指针是C++标准库提供的一种对象,它封装了一个原始指针,并自动管理底层资源的生命周期。例如,`std::unique_ptr`保证了对资源的唯一所有权,而`std::shared_ptr`则实现了引用计数,多个智能指针...

    Boost智能指针

    与原始指针不同,智能指针通过封装额外的操作来帮助开发者避免常见的内存泄漏和其他资源管理问题。Boost库提供了多种智能指针类型,每种类型针对不同的使用场景进行了优化。 #### 二、Boost智能指针分类 Boost库中...

    C++智能指针实现(包含拷贝构造,赋值函数,引用解引用重载)

    智能指针实际上是一个封装了原始指针的对象,它拥有一个内部的引用计数,用于跟踪有多少个智能指针指向同一块内存。当智能指针被销毁或赋值给其他智能指针时,这个引用计数会被相应地增加或减少。当引用计数变为零时...

    C++智能指针详解abc

    智能指针是一种封装了原始指针的智能对象,它的使用方法类似于普通指针,但它可以自动管理所指向的资源,避免了常见的内存泄漏和悬挂指针等问题。C++11 引入了四种智能指针:unique_ptr、shared_ptr、weak_ptr 和 ...

    COM技术内幕第9章代码客户端智能指针(VS2008通过)

    在COM编程中,智能指针是一种封装了IUnknown接口的类,如Microsoft的 `_com_ptr_t` 或 ATL(Active Template Library)的 `CComPtr` 和 `CComQIPtr`。这些智能指针类实现了引用计数机制,自动调用 `AddRef` 和 `...

    智能指针的标准之争+再论智能指针的标准之争

    智能指针是一种封装了原始指针的对象,它能够自动管理所指向对象的生命周期。当智能指针对象被销毁时,其所持有的原始指针所指向的对象也会被自动删除,这个过程通常通过`析构函数`来实现。这样就避免了经典的内存...

    boost 智能指针

    智能指针是一种管理动态分配内存的机制,它们通过封装指针操作来避免资源泄漏和悬挂指针等问题。相比于传统的裸指针,智能指针能够自动管理对象的生命周期,尤其是在遇到异常情况时,智能指针可以确保对象被正确地...

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    在实际操作中,为了使序列化过程更加简洁,通常会创建辅助类(如`shared_ptr_helper.cpp`和`shared_ptr_helper.hpp`中的类)来封装特定类型的智能指针的序列化和反序列化过程。例如,你可以创建一个`serialize`模板...

    简单的智能指针实现

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

    C++ 智能指针实现

    智能指针是一种封装了原始指针功能的对象,它通过资源管理策略来自动控制指向的对象的生命周期。具体来说,智能指针可以: 1. **包裹原始指针**:将原始指针的功能封装起来,使得开发者可以通过智能指针接口来访问...

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

    智能指针是一个类,它封装了一个原始指针,提供了类似原始指针的接口。当智能指针被复制时,不是创建一个新的内存块,而是复制指向同一内存块的引用。这意味着所有复制的智能指针都指向同一个对象。当不再有智能指针...

Global site tag (gtag.js) - Google Analytics