野指针只能避免不可以处理吗?

anhuihulei 2018-03-02 05:49:49
我的平台上用智能指针保存了变量,别人的插件可以通过接口获取它,但他们一旦用他的裸指针对象把持着我这个智能指针的裸指针,我就无法控制他,我内部正常生命周期结束析构,而他们的裸指针生命周期更长,那么他们再次使用时野指针了(他们爱用裸指针或者必须使用裸指针)。我是否可以提供一个接口,让他们从我这获取指针对象时把他们的裸指针地址取址byte* a=&p 给我,我给他保存起来,在我析构对象时,把这地址里的东西擦掉,那么他们再次在他们的区域使用他们的裸指针时,它就没有指向,为NULL了,那么他们判断一下即可不出错;问题是byte*a又是一个新的地址,指向的是他们的裸指针,如何在不知道他们对象而只知道他们对象的地址时如何改掉他们对象的指向。我们为啥要老是去避免避免野指针,整个方法处理一下可好?
...全文
654 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
anhuihulei 2018-03-08
  • 打赏
  • 举报
回复
引用 3 楼 han542672919 的回复:
这个事情没必要费心了吧,给他们unique_ptr吧,告诉使用这不要 获取原生指针。非要这么做的话,崩溃活该。
活该倒是,浪费的是我的钱,客户是上帝,说啥我得去
anhuihulei 2018-03-08
  • 打赏
  • 举报
回复
引用 2 楼 ckc 的回复:
你提供一个接口给别人使用,这之后你就不应该自行析构,应该让对方控制析构,对方在析构的时候自己处理相关的指针清零,这样就不会错了。 如果非要你来析构,那按你的思想也是可以的啊,对方提供它的指针的指针给你,你在析构的时候就可以把对方的指针清零了。 知道对象的地址,知道对象的类型(是个指针),加个*(类型 *)就可以处理了。
对于第一句:我使用的是智能指针,如果他们用全局变量把持我智能指针的裸指针,我是没什么好办法,而裸指针是我new的,我需要控制生命周期 对于第二句:他的指针为a,他指针a的指针为b,他把b给我,我在对象生命周期到的时候把b置为null,但对a有影像吗?a还是指向一个野指针,他使用a时一样出错 感谢兄弟回答,指针的四个字节里存储的东西怎么能抹掉呢,我们不知道还能不能想出其他办法。。
anhuihulei 2018-03-08
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
没法去改变他的指针,就算你有他指针的地址并可以修改他,你也不能保证他会复制给其他变量,并且你把其他变量也修改了。你只能告诉他指针指向的内存在什么时候有效,超过这个范围行为未定义,它如果不按说明使用造成的后果由它负责。如果他使用这个指针只是用于传递给你的其他函数,你甚至可以封装成一个句柄,而不是指针。很多API都是这样的情况
对于第一句话,你说的确实对,他们还可能复制给其他的他们类的成员变量,局部变量倒没关系,我会告诉他们一定用智能指针,但客户们多而经常换新人,跑了好几个城市最后都是他们开发使用的问题,关键也是有个小问题,我需要反射他们的插件,对于反射函数必须传入裸指针对象,不能使用智能指针作为函数参数,不然头文件相互包含,就这个小问题浪费上万的差旅;句柄方式还不太了解,我要去了解一下,谢谢朋友的回答
狐狸小十 2018-03-08
  • 打赏
  • 举报
回复
com组件了解一下 这方面教材第一句基本都说,这是一门让人又爱又恨的技术 小工程纯属累赘,团队工程也不能保证万无一失,用了+1,用完-1,肯定有人会忘 反正就是这么个规范,用的人不多但也约定俗成,至少出问题好解释
xiaohuh421 2018-03-06
  • 打赏
  • 举报
回复
野指针, 只能避免, 没办法处理得. 这是c/c++最老火的地方. 一般解决办法就是不提供指针给他使用, 而仅是提供函数给他访问需要的数据.
编程小鱼酱 2018-03-06
  • 打赏
  • 举报
回复
模块和模块通信用C语言数据结构,进程与进行用socket 共享内存。对于指针,谁创建谁释放,这样便于管理。
donjin9 2018-03-05
  • 打赏
  • 举报
回复
或者像智能指针那样。 别人通过接口获取,你就计数加1。再弄个释放的接口(计数减1),至于用不用那是他们的事了。
FoolCarpe 2018-03-05
  • 打赏
  • 举报
回复
正常的使用智能指针
ztenv 版主 2018-03-05
  • 打赏
  • 举报
回复
用智能指针吧,会让你省心很多。
zilaishuichina 2018-03-03
  • 打赏
  • 举报
回复
既然已经使用了智能指针, 对方再使用裸指针就是错误的使用方法, 对于错误的使用方法,就没有什么好说的了,就不应该这么做 你可以把智能指针再封装一层, 把获取裸指针的接口私有掉, 不让对方获取裸指针。 如果对方一定要使用裸指针, 就让对方自己控制内存在什么时候释放,就不要用智能指针 智能指针本身是用引用计数来识别一块内存还有没有被使用, 没有被使用了就释放掉, 如果使用了裸指针, 就没法进行计数了,这两件事本身就是冲突的
Saleayas 2018-03-03
  • 打赏
  • 举报
回复
你为什么把别人还在使用的对象销毁掉呢?
J_流儿 2018-03-03
  • 打赏
  • 举报
回复
这个事情没必要费心了吧,给他们unique_ptr吧,告诉使用这不要 获取原生指针。非要这么做的话,崩溃活该。
ckc 2018-03-03
  • 打赏
  • 举报
回复
你提供一个接口给别人使用,这之后你就不应该自行析构,应该让对方控制析构,对方在析构的时候自己处理相关的指针清零,这样就不会错了。 如果非要你来析构,那按你的思想也是可以的啊,对方提供它的指针的指针给你,你在析构的时候就可以把对方的指针清零了。 知道对象的地址,知道对象的类型(是个指针),加个*(类型 *)就可以处理了。
super_admi 2018-03-03
  • 打赏
  • 举报
回复
正确的做法是:不要在接口里传指针,而是要传变量。绝大多数情况下,涉及到接口,我传的都是字符串。
真相重于对错 2018-03-03
  • 打赏
  • 举报
回复
我认为谁创建谁销毁
paschen 版主 2018-03-02
  • 打赏
  • 举报
回复
没法去改变他的指针,就算你有他指针的地址并可以修改他,你也不能保证他会复制给其他变量,并且你把其他变量也修改了。你只能告诉他指针指向的内存在什么时候有效,超过这个范围行为未定义,它如果不按说明使用造成的后果由它负责。如果他使用这个指针只是用于传递给你的其他函数,你甚至可以封装成一个句柄,而不是指针。很多API都是这样的情况

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧