智能指针的实现(构造,析构,赋值,移动,析构)与测试

本文详细探讨了C++智能指针的实现原理,包括构造、析构、赋值和移动操作,并通过具体的测试代码展示了其行为和效果,验证了智能指针在内存管理中的正确性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

智能指针代码:

//  引用计数器类  用于存储指向同一对象的指针数
template<typename T>
class Counter
{
private:
	//  数据成员
	T* ptr;    //  对象指针
	int cnt;   //  引用计数器
	//  友元类声明
	template<typename T>
	friend class SmartPtr;
	//  成员函数
	//  构造函数
	Counter(T* p)   //  p为指向动态分配对象的指针
	{
		ptr = p;
		cnt = 1;
	}
	//  析构函数
	~Counter()
	{
		delete ptr;
	}
};

//  智能指针类  
template<typename T>
class SmartPtr
{
private:
	//  数据成员
	T* ptr;
	Counter<T>* ptr_cnt;

public:
	//  普通构造函数  初始化计数类
	SmartPtr(T* p) : ptr(p), ptr_cnt(new Counter<T>(p))
	{
	}
	//  拷贝构造函数
	SmartPtr(const SmartPtr& other) : ptr(other.ptr), ptr_cnt(other.ptr_cnt)
	{
		ptr_cnt->cnt++;
	}
	//  移动构造函数
	SmartPtr(SmartPtr&& other) : ptr(std::move(other.ptr)), ptr_cnt(std::move(other.ptr_cnt))
	{
		other.ptr_cnt = nullptr;
	}

	//  赋值重载
	SmartPtr& operator=(const SmartPtr& rhs)
	{
		if (ptr_cnt != rhs.ptr_cnt)
		{
			if (ptr_cnt != nullptr)
			{
				ptr_cnt->cnt--;
				if (ptr_cnt->cnt == 0)
					delete ptr_cnt;
			}
			ptr = rhs.ptr;
			ptr_cnt = rhs.ptr_cnt;
			rhs.ptr_cnt->cnt++;

		}
		return *this;
	}

	// 移动赋值重载	
	SmartPtr& operator=(SmartPtr && rhs)
	{
		if (ptr_cnt != rhs.ptr_cnt)
		{
			std::swap(this, rhs);
		}
		return *this;
	}

	//  析构函数
	~SmartPtr()
	{
		if (ptr_cnt != nullptr)
		{
			ptr_cnt->cnt--;
			if (ptr_cnt->cnt == 0)
				delete ptr_cnt;
		}
	}

	T& operator*()     const { return *(ptr); }
	T* operator&()     const { return ptr; }
	size_t use_count() const { return ptr_cnt->cnt; }
	bool unique()      const { return (ptr_cnt->cnt == 1); }
	T* get()           const { return ptr; }
};

测试代码:

class test
{
public:
	int n;
	test(int i) :n(i)
	{
		std::cout << "c " << n << std::endl;
	}
	~test()
	{
		std::cout << "d " << n << std::endl;
	}
};

int main(int argc, char** argv) {
	SmartPtr<test> p1 = new test(1);//构造
	std::cout << p1.use_count() << std::endl; //1?
	SmartPtr<test> p2 = p1;//复制构造
	std::cout << p1.use_count() << std::endl;//2?
	std::cout << p1.get()->n << p2.get()->n << std::endl;//11?
	SmartPtr<test> p3(std::move(p2));//移动构造
	std::cout << p1.use_count() << std::endl;//2?
	SmartPtr<test> p4 = new test(2);
	p3 = p4;//赋值
	std::cout << p4.use_count() << p1.use_count() << std::endl;//21?

	return 0;
}

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值