C++实现简单的unique_ptr

核心是 1.delete掉左值引用的拷贝构造和赋值重载

2.使用右值引用+移动构造和移动

头文件 my_unique_ptr.h
#ifndef  MY_UNIQUE_PTR
#define MY_UNIQUE_PTR
class my_unique_ptr {  //单独的int型
private:
	int* raw_ptr;
public:
	my_unique_ptr(void* mem);
	~my_unique_ptr();

	my_unique_ptr(const my_unique_ptr&  p) = delete; //采用delete 方法 或者声明到private里面,禁用传统拷贝构造和赋值运算符重载
	my_unique_ptr& operator= (const my_unique_ptr& p) = delete;

	my_unique_ptr(my_unique_ptr&& p);  //移动构造
	my_unique_ptr& operator= (my_unique_ptr&& p);  //移动=重载

	void show();
 };
#endif


源文件 my_unique_ptr.cpp
#include "my_unique_ptr.h"
#include <iostream>
my_unique_ptr::my_unique_ptr(void* mem) {
	raw_ptr =(int*) mem;
}

my_unique_ptr::~my_unique_ptr() {
	if (raw_ptr != nullptr)
		delete raw_ptr;
}

my_unique_ptr::my_unique_ptr(my_unique_ptr&& p) {
	raw_ptr = p.raw_ptr;
	p.raw_ptr = nullptr;
}

my_unique_ptr&  my_unique_ptr::operator= (my_unique_ptr&& p) {
	raw_ptr = p.raw_ptr;
	p.raw_ptr = nullptr;
	return *this;
}

void my_unique_ptr::show() {
	if (raw_ptr == nullptr)
		std::cout << "this unique_ptr is nullptr" << std::endl;
	else
		std::cout << "the val is: " << *raw_ptr << std::endl;
}


主函数:
#include <iostream>
#include "my_unique_ptr.h"
int main() {
	my_unique_ptr p1 = new int(3);
	my_unique_ptr p2 = std::move(p1); //这时调用的其实是拷贝构造
	//my_unique_ptr p3(p2); //会报错
	//my_unique_ptr p3=p2; //会报错
	my_unique_ptr p3(std::move(p1));
	my_unique_ptr p4;
	p4 = std::move(p2);  //这时调用的才是=重载

	p1.show();
	p2.show();
	p3.show();
	p4.show();
	return 0;
}

赋值重载

unique_ptrC++11 中引入的智能指针,用于管理动态分配的对象。 unique_ptr 的特性是:它是唯一拥有(unique ownership)被管理对象的智能指针,也就是说,同一时间只能有一个 unique_ptr 指向一个对象。当 unique_ptr 被销毁时,它会自动释放所管理的对象内存。 下面是 unique_ptr简单实现: ```cpp template <typename T> class unique_ptr { public: unique_ptr(T* ptr = nullptr) : m_ptr(ptr) {} ~unique_ptr() { delete m_ptr; } unique_ptr(const unique_ptr&) = delete; unique_ptr& operator=(const unique_ptr&) = delete; unique_ptr(unique_ptr&& other) noexcept : m_ptr(other.m_ptr) { other.m_ptr = nullptr; } unique_ptr& operator=(unique_ptr&& other) noexcept { if (this != &other) { delete m_ptr; m_ptr = other.m_ptr; other.m_ptr = nullptr; } return *this; } T* get() const { return m_ptr; } T* operator->() const { return m_ptr; } T& operator*() const { return *m_ptr; } private: T* m_ptr; }; ``` 这是一个简化版本的 unique_ptr,它包含了基本的功能,如构造函数、析构函数、移动构造函数、移动赋值运算符,以及 get()、operator->() 和 operator*() 方法。 需要注意的是,这个实现并不完整,只是为了演示 unique_ptr 的基本原理和用法。实际使用时,应该考虑更多的细节,如空指针检查、自定义删除器等。另外,C++11 中已经提供了标准库中的 unique_ptr 实现,我们通常会使用标准库中的智能指针而不是自己实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值