C++ unique_ptr的简单实现

204 阅读1分钟

写了一个简单的int*的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

源文件:

#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;
}