全能指针 (初步) (待续)
智能指针可以用来处理动态内存回收的问题
但一旦令智能指针指向栈内存 如:
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、全局重载并不是好的解决方案。
(待续)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。