全能指针 (初步) (待续)

智能指针可以用来处理动态内存回收的问题

但一旦令智能指针指向动态内存 如:

int a = 2;
scoped_ptr<int> spi1(&a);

程序肯定会发生崩溃。原因是在spi1出了作用域进行析构函数的时候,会对栈内存进行delete,这是不合法的。

假如能解决这个问题,我们的智能指针就能指向任何内存了。

(PS:智能指针被设计之初,就是用来解决动态内存的回收问题的。所以其实我这样折腾也许意义不大,纯属瞎搞)

我的思路是,重载operator new 和 operator delete操作符 ,

在operator new 中,将每次开辟的动态内存的地址存入一个数组arr(或者说顺序表),

在operator delete中,每次先判断要回收的内存是否在数组arr中:

若存在:说明要回收的内存是动态内存,执行回收,并将这个地址从数组arr中删掉

若不存在:说明要回收的内存是栈内存(静态内存),不执行回收,直接return掉。

由于目前采用的是全局重载的方式 operator new中的push_back操作也存在new ,如果用库里的vector或list 肯定会发生循环递归。

所以目前我采用的方式是自己写一个不支持动态增长的顺序表(很土的方法吧?)

目前只是个半成品,需要添、改的地方还很多,先厚着脸皮贴上来。

具体代码如下:

//万能new delete 模型(初步)
#define DEFAULT_CAPA 100
using namespace std;

struct DynamicMemoryAddr
{
	void PushBack(void *data)
	{
		arr[_i++] = data;
	}
	void PopBack()
	{
		--_i;
	}
	int Find(void *data)
	{
		for (int i = 0; i < _i; i++)
		{
			if (arr[i] == data)
			{
				return i;
			}
		}
		return -1;
	}
	void Delede(void *data)
	{
		int i = Find(data);
		if (i == -1)
		{
			return;
		}
		else
		{
			for (int j = i; j < _i - 1; j++)
			{
				arr[j] = arr[j + 1];
			}
		}
		--_sz;
	}
	void Print()
	{
		for (int i = 0; i < _i; i++)
		{
			cout << arr[i] << " ";
		}
		cout << endl;
	}
	void *arr[DEFAULT_CAPA];
	int _i = 0;
	int _sz = DEFAULT_CAPA;
};

DynamicMemoryAddr addr;
void *operator new(size_t size)
{
	cout << "operator new" << endl;
	void* ret = malloc(size);
	addr.PushBack(ret);
	return ret;
}

void operator delete(void *ptr)
{
	if (addr.Find(ptr) == -1)   //栈内存
	{
		return;
	}
	else						//堆内存
	{
		cout << "delete : " << ptr << endl;
		addr.Delede(ptr);
		free(ptr);
	}
}
int main()
{
	int *pi1 = new int(1);
	int *pi2 = new int(2);
	int *pi3 = new int(3);
	int a = 2;
	int *pi4 = &a;
	addr.Print();
	delete pi1;
	delete pi2;
	delete pi3;
	return 0;
}

目前的问题有:

1、我用的顺序表不支持动态增长

2、全局重载并不是好的解决方案。

(待续)

时间: 2024-10-29 17:58:48

全能指针 (初步) (待续)的相关文章

zerglurker的C语言教程004——指针初步讲解

在上次的教程里面,我提到了指针. 针对指针,这次我将简单的讲讲,后面我还会讲到--那个时候你应该有了相当的基础. 首先,先讲讲指针类型. 任何类型关键字后面加一个*符号,就会变成指针类型. 比如: char → char* 字符指针 int → int* 整数指针 double→double* 双精度指针 甚至还可以这样: char*→char** 字符指针的指针类型 →char*** 字符指针的指针的指针类型- 指针本质上是一个内存地址值,该内存地址上存放的是相关类型的数值.但是void*指针

网易云课堂程序设计入门--C语言第七周:指针与字符串学习笔记

====================================== 第七周:指针与字符串学习笔记 网易云课堂 程序设计入门–C语言 指针与字符串 学习笔记 ====================================== 7-1指针初步 7-1-1类型大小与取地址运算 sizeof是一个运算符 给出某个变量货类型在内存中所占据的字节数 sizeof(int); sizeif(i); double变量在内存中占据的空间是int变量的两倍 { int a; a =6; prin

成为C++高手之指针与数组

指针初步 定义一个指针变量:int * a=NULL; int 是指针的类型,其实应该说是指针指向的数据的类型. 程序运行时,数据都是放在内存中的,既然在内存中,就处于内存中的某个位置,这就是数据的地址.指针中保存的就是这个地址.所以不论什么类型的指针,指针变量本身之间并没有区别,值都是一个整数值.32位程序中这个整数是32位的,64位程序中这个整数是64位的.其实指针变量与整型变量之间跟本没有区别,就看你怎么解释它了.一个整数你可以把它解释为指针也可以解释为整数,所以指针与整数之间可以轻松转换

c++核心-字符串、向量和数组及指针详解

关于STL的内容后面再详细介绍,string和vector都是标准模板库的内容. 数组是C的复合类型(可能只有我这么叫),一组数据,空间连续,所以由开始也有结束,从0开始,到n-1结束.注意别越界,因为是从0开始的. string和vector内部的保存数据的空间也是一个数组,所以空间也是连续的,可以看做数组的封装,同时提供了很多便利的操作,因为便利,所以也会一定程度减少自己犯错误的机会. 空间连续所以可以通过下标(随机,所谓随机,就是可以直接访问,不需要从头一个一个找下来才能找到)访问.因为跟

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

单片机教程.指针的基础与1602液晶的初步认识

指针的基础与1602液晶的初步认识 我们在上C语言课的时候,学到指针,每一位教C语言的老师都会告诉我们一句:指针是C语言的灵魂.由此可见,指针是否学会是判断一个人是否真正学会C语言的重要指标之一,但是很多同学只知道其重要性,却没学会其灵活性. 简单的程序,100来行代码,不需要指针我们可以轻松搞定,但是当代码写到几千上万行甚至更多的时候,利用指针就可以直接而快速的处理内存中的各种数据结构中的数据,特别是数组.字符串和内存的动态分配等,它为函数之间各类数据传递提供了简洁便利的方法.说了这么多作用估

Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值

目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址      内存地址就是指针.来看个小案例 #include<stdio.h> #include<stdlib.h> /** 指针就是内存地址 内存地址就是指针 */ main() { //定义一个int类型的变量i,并且赋值为10 int i=10; //定义一个int类型的一级指针变量p int* p; //把i对应的地址给p变量 p=&i; //指针取值*p:把p变量地址对应的值取出来 printf(&q

指针的初步认识

指针的概念:在计算机中数据式存储在存储器中的,存储器的一个字节称为一个内存单元,不同的系统不同的数据类型它所占据的内存单元不是同的,在64位的系统里,一个整型占据4个字节,一个字符占据1个字节,为了方便访问内存单元,每一个内存单元都有一个编号,这个编号也叫地址,通过地址可以找到相应的内存单元,所以我们就称这个地址为指针.所以说指针实际就是内存的编号或者说是地址. 指针访问变量:在没有学到指针之前我们修改一个变量一般是这么做的: 1 int a = 5; 2 3 a = 8; 第一行代码是定义个整

数据结构复习之C语言指针与结构体

数据结构指针复习: #include <stdio.h> void main() { int a[5] = {8, 2, 3, 4, 5}; // a[3] == *(3+a) printf("%d\n", *(3+a)); // a[3] 4 printf("*a其实就是a[0]: %d\n", *a); // 8 // 地址是连续的 printf("%p\n", a+1); printf("%p\n", a+2