C++内存管理神器之模板化的智能指针

先上代码(MinGW下编译测试通过):

C++标准类库里面有实现智能指针auto_ptr,位于头文件<memory>。

 

/*
 * SmartPointer.h
 *
 *  Created on: 2010-10-27
 *      Author: LayzerAr
 */

#ifndef __SMARTPOINTER_H_INCLUDE__
#define __SMARTPOINTER_H_INCLUDE__

template<class T>
class SmartPointer {
public:
	SmartPointer(T* ptr = 0) :
		Ptr(ptr) {
	}

	SmartPointer(SmartPointer<T>& other) :
		Ptr(other.Ptr) {
		other.Ptr = 0;
	}

	virtual ~SmartPointer() {
		release();
	}

	SmartPointer<T>& operator=(SmartPointer<T>& other) {
		if (this != &other) {
			this->Ptr = other.Ptr;
			other.Ptr = 0;
		}
		return *this;
	}

	T& operator*() const {
		return *Ptr;
	}

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

	void release() {
		if (Ptr != 0) {
			delete Ptr;
			Ptr = 0;
		}
	}

	void reset(T* newptr) {
		if (Ptr != newptr) {
			release();
			Ptr = newptr;
		}
	}

private:

	T* Ptr;
};

#endif /* __SMARTPOINTER_H_INCLUDE__ */

 

概述:

  我们经常为C++的内存管理叫苦不迭,简单的代码还好,稍微复杂一点,可能就会忘记delete掉new出来的对象,这样就造成了内存泄漏,多次delete可能会使程序崩溃。

  为什么说模板化的智能指针是C++内存管理的神器呢?

  首先,我们必须改变代码风格:不再返回指针Object*,取而代之用SmartPointer<Object>(非指针、非引用),并且在该模板类的实例里面保存有我们需要的指针Object*。

  那么我们来看一下:

  SmartPointer类里面重载了解引用操作符,这意味着,我们可以直接用SmartPointer<Object>类的实例(obj->func(),*(obj).func())来访问Object的公有成员;

  由于我们返回的SmartPointer<Object>并非是new出来的对象,所以当该变量超出了作业范围时,会根据析构函数(在析构函数中调用release()方法,这里我们定义了SmartPointer指向的Object*的析构规则)来析构本对象和期指向的对象,这意味着,我们即使忘了了调用delete也没关系,因为他会Object*指向的实例会跟随这SmartPointer变量一起被析构,多美妙啊;

  在性能需求下,我们还可以调用release()方法主动析构掉Object*;

  另外,由于这个SmartPointer经过了模板化,所以几乎可以适用与任何类的指针,只增加少量的代码,就轻松方便的实现了C++内存管理。

原文链接: https://www.cnblogs.com/LayzerAr/archive/2010/10/27/1862953.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++内存管理神器之模板化的智能指针

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/16646

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午5:01
下一篇 2023年2月7日 下午5:01

相关推荐