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

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

inta=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,肯定会发生循环递归。

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


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

具体代码如下:

//万能newdelete模型(初步)#defineDEFAULT_CAPA100usingnamespacestd;structDynamicMemoryAddr{voidPushBack(void*data){arr[_i++]=data;}voidPopBack(){--_i;}intFind(void*data){for(inti=0;i<_i;i++){if(arr[i]==data){returni;}}return-1;}voidDelede(void*data){inti=Find(data);if(i==-1){return;}else{for(intj=i;j<_i-1;j++){arr[j]=arr[j+1];}}--_sz;}voidPrint(){for(inti=0;i<_i;i++){cout<<arr[i]<<"";}cout<<endl;}void*arr[DEFAULT_CAPA];int_i=0;int_sz=DEFAULT_CAPA;};DynamicMemoryAddraddr;void*operatornew(size_tsize){cout<<"operatornew"<<endl;void*ret=malloc(size);addr.PushBack(ret);returnret;}voidoperatordelete(void*ptr){if(addr.Find(ptr)==-1)//栈内存{return;}else//堆内存{cout<<"delete:"<<ptr<<endl;addr.Delede(ptr);free(ptr);}}intmain(){int*pi1=newint(1);int*pi2=newint(2);int*pi3=newint(3);inta=2;int*pi4=&a;addr.Print();deletepi1;deletepi2;deletepi3;return0;}

目前的问题有:

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

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



(待续)