22

关于智能指针的一个疑问 - D_Guco的专栏 - CSDN博客

 4 years ago
source link: https://blog.csdn.net/D_Guco/article/details/93313195?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

关于智能指针的一个疑问

D_Guco 2019-06-22 13:07:09 917
分类专栏: c/c++

     c++中最大的问题就是内存管理问题也就是指针,当一个指针在程序中到处传的时候,经常会出现多次销毁,或者用到一个已经被释放的指针(野指针),特别是在多线程中这种情况更加难以处理,根本不知道什么时候会在哪个线程中被释放,虽然c++11中的智能指针有效的解决了这个问题,在很大程度上简化了内存管理的难度,但是使用不当还是会导致程序崩溃,比如你在使用的时候把一个智能指针reset或者把nullptr赋给了目标智能指针,这个时候裸指针起最根本的问题还是会暴露出来,究其根本还是智能指针的设计导致的。

     当我们使用智能指针的时候其实是调用了智能指针魔板累的->操作符重载函数,我们可以看到这个函数noexcept标记,标准委员默认调用此函数时_M_ptr一定不为空,再一次大权还给了程序员,人都是会犯错的,而这些错都不是我们想犯得,虽然我们总是提醒自己使用前做不为空判断,但是有时候就是会忘,更重要的是在多线程环境中如果你没有保证判断和判断后的逻辑是线程安全的,这个判断是不可信的,最终还是会崩溃。

    我一直在考虑c++能不能像java等一些语言使用对象指针,在对象为空时抛出异常而不是崩溃,但是这个逻辑不能靠程序员在每次使用时做判断来实现,这个判断只能是预防,而最终需要一个屏障来百分之百拦截所有的异常。想了很久都没有找到好的办法,直到我看到了这个函数,突然想到了解决的办法,就是重写智能指针的->重载操作函数,只要重写这一个函数所有的问题都解决了。下面是我的一个小小的例子。

   

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RfR3Vjbw==,size_16,color_FFFFFF,t_70

      一个好的系统所有的逻辑处理都会有一个统一的入口我们暂且称之为消息路由器,我们只需要在这里捕获所有的异常然后在次处理程序错误即可,这样一个消息逻辑异常并不会导致整个系统的崩溃,其他消息可正常运行,这样我们就可以像java对象一样使用智能指针。当然这里仅仅是一个解决问题的思路和一个小小的例子,如果要实用到项目中像shared_ptr一样使用,需要把shared_ptr里所有的操作符重载函数都要实现一遍才行。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK