思路

一开始打算用void*,但是运行一看,void*没有指明要释放的内存大小,所以没办法。
于是就用了数组,其实直接用char就行。
模板类Pointer需要一个内存的大小,然后申请连续的内存(char是1字节),最后由于指明了类型,所以会完美释放。
get()接受一个偏移量,从起始位置开始偏移,之后强制类型转换为int,或者其他,最后赋值。
不够完美,但大体思路就这样。
这个设计是为之后的类申请内存所设计的。

代码

#include <iostream>

struct MemoryUnit
{
	char data;
	
	~MemoryUnit()
	{
		std::cout << "~mu " << int(data) << std::endl;
	}
};

/*template<typename T>
struct Pointer
{
	MemoryUnit* ptr;
	
	T* get()
	{
		return (T*)ptr;
	}
	Pointer(T v)
	{
		ptr = new MemoryUnit[sizeof(T)];
		*get() = v;
	}
	~Pointer()
	{
		delete[] ptr;
		std::cout << "~Pointer" << std::endl;
	}
};*/

template<size_t size>
struct Pointer
{
	MemoryUnit* ptr;
	
	void* get(size_t offset)
	{
		char* a = (char*)ptr + offset;
		return (void*)a;
	}
	Pointer()
	{
		ptr = new MemoryUnit[size];
	}
	~Pointer()
	{
		delete[] ptr;
		std::cout << "~Pointer" << std::endl;
	}
};

int main(int argc, char *argv[])
{
	/*Pointer<long> p(666);
	std::cout << *p.get() << std::endl;*/
	Pointer<8> p;
	(*(int*)p.get(0)) = 666;
	(*(int*)p.get(4)) = 999;
	std::cout << *(int*)p.get(0) << std::endl;
	std::cout << *(int*)(p.get(4)) << std::endl;
	return 0;
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐