精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容
最近看httplib的源代码,里面用到了share_ptr,要掌握share_ptr要先掌握auto_ptr,虽然auto_ptr已经废弃了,但是它是过渡类,中间过渡类掌握了才好掌握后面的类,这是auto_ptr的目的,过渡。
在研究了msdn和codeproject文章下,说下自己理解,不会看msdn,找我了,左边有联系方式。
另外auto_ptr的功能目的就是不让程序员在C++开发时写delete,就是忘记写时,C++也能帮你回收内存。
但是内存处理很麻烦,遇到了auto_ptr解决不了的问题,所以废弃了auto_ptr,解决不了问题是:
在函数调用出现两个auto_prt对象共用一块内存区时,函数内对象在函数退出已经释放了内存区,而函数外再释放已经释放的内存区时,会崩溃。 函数调用参数auto_ptr对象在出现时,会拥有内存区,而实参会让出内存区,但是实参不知道已经让出去了。这bug是编写auto_ptr时就遗留下的,就像没用深拷贝一样,用了浅拷贝。 再修补也没必要,就换新类。
习惯了原始指针,要考虑如何适应auto_ptr,其它它的思想和COM机制类似,也和STL里的string相仿,string里封装了char*,而auto_ptr里封装了指针,另外学过C#的Type类的思想也会理解auto_ptr。
string对象,用c_str获取到原始指针,而auto_ptr是用get函数获取指针。
说实话,类封装的太多,像套娃一样,真是不舒服,如果当初一步到位,把new关键字设计一些类似new的关键字,比如new_auto,用底层来保留指针的属性,new_auto分配出来的还是原始指针*,和以前模式兼容,就更好了。
至于想获取指针属性信息,再用isof和强制转换实现,这多舒服。看到类型名长,咱们华人就不舒服,不适应,西方适应了这类修饰风格,所以一直搞这样的形式。