免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5951 | 回复: 18
打印 上一主题 下一主题

[C++] c++ 有点小危险阿 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-30 13:06 |只看该作者 |倒序浏览
本帖最后由 SNYH 于 2011-08-30 13:08 编辑

调试了一上午总算把昨天的一个奇怪的bug找到了

源自于  c++的 对象布局的特殊性(bug 当然是我自己的无知,和c++没什么关系)

  1. class Model {
  2. public:
  3.     void fun1();
  4.     void fun2();
  5.     .....
  6. private:
  7.    Type1  m1;
  8.    Type2  m2;
  9. };
复制代码
这个Model类主要是用来封装算法的,放在另外的一个control类里面

  1. class Control {
  2. public :
  3.     ....
  4. private:
  5.     Model* model;
  6. };
复制代码
Control是个单例写 getInstance()的时候直接写上了new Control() 但我根本就没写Control的构造函数,编译器就默认给了个我, 悲剧的事情就即将发生了.

运行crash.    gdb跟踪跟到Model的fun1, 发现在调用成员m1时候崩溃,  那个成员类型是opencv2的cv::Mat, 因为刚接触这个,所以就注意力一直放在这个Mat上面.
网上查找发现有类似的bug, 只不过别人是在resize的时候崩溃, 其他情况很相似也是用wxWidgets+Opencv 错误地方也是一样.
然后继续gdb找阿找阿.  发现是在Mat::release()的时候出问题, 看opencv2的源码,  里面先检测refcount的值然后处理.     
可我refcount指向的并非是合法内存,   cv::Mat构造的时候难道不初始化这个指针阿.      

以下是重点,上面都是废话
过了会突然想到好像没地方构造过Model,  这个model从头到尾就是个野指针.  但由于Model的成员函数大部分都没有使用数据成员或者是设置数据成员而没访问数据成员.
所以开始一切OK,  直到Model里面的某个函数调用某个成员的方法时内存越界 程序崩溃.

c++ class的成员函数不需要类构造就可以使用, this只是在访问数据成员的时候才起作用.  

指针好危险.........

论坛徽章:
0
2 [报告]
发表于 2011-08-30 13:14 |只看该作者
最基本的初始化你都没做,还说什么呢?

良好的习惯可以大大降低这种低级错误的发生概率

论坛徽章:
0
3 [报告]
发表于 2011-08-30 13:15 |只看该作者
c++ class的成员函数不需要类构造就可以使用, this只是在访问数据成员的时候才起作用.  

没看懂你这句话的意思

Object *obj;
obj->goFuckYourself(); // 你自己不创建对象,还要怪编译器?

你上面的Model还不如不用指针,直接成员对象,或者Control维护一个引用,为什么要new对象,然后还要费事去处理delete。。。

论坛徽章:
0
4 [报告]
发表于 2011-08-30 13:28 |只看该作者
本帖最后由 xyfree 于 2012-01-21 05:54 编辑

论坛徽章:
0
5 [报告]
发表于 2011-08-30 13:45 |只看该作者
c++ class的成员函数不需要类构造就可以使用, this只是在访问数据成员的时候才起作用.  

没看懂你这句话 ...
雨过白鹭洲 发表于 2011-08-30 13:15



    我先FuckMyself..

我并没有怪编译器的意思。  
我没初始化就用我肯定是活该浪费时间..   

只是小小小小抱怨下
成员函数在对象没有构造的时候也可以使用
(我大概清楚可以使用的原因所以也不能怪编译器没让我的代码在进入任何成员函数的时候就直接崩溃)

Model一开始用指针是因为Model里使用了cv::Mat作为成员(非指针), 昨天才开始了解opencv所以以为这个结构会很大.

你这么一说确实直接做成员对象.  

专门去面对细节的时候会比较小心多考虑考虑.
不过东西一多,特别是不熟悉的时候就总急着实现功能去,而很难注意细节(这种现象当然是我经验不足)

论坛徽章:
0
6 [报告]
发表于 2011-08-30 13:47 |只看该作者
莫非楼主是从GC上的语言转过来使用c++的?
xyfree 发表于 2011-08-30 13:28



    我知道很丢人.  
不过我是从c, 然后python, java, haskell之类的gc语言之后 转c++的.

也一直铭记  资源要申请 要释放。     

只是... 悲剧还是发生了

论坛徽章:
0
7 [报告]
发表于 2011-08-30 13:51 |只看该作者
这也称得上悲剧呀?????!!!

论坛徽章:
0
8 [报告]
发表于 2011-08-30 14:18 |只看该作者
本帖最后由 xyfree 于 2012-01-21 05:54 编辑

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-12-21 06:20:00平安夜徽章
日期:2015-12-26 00:06:30
9 [报告]
发表于 2011-08-30 14:19 |只看该作者
做c++开发很有前途哦。希望更多的人加入这个行业,嘿嘿。
我们公司在招聘c++工程师,以下是岗位职责,有意向的可以联系我哦。联系qq:1732153787(小陶)
C/C++开发工程师(Linux方向)
岗位职责:
1. 负责Linux平台软件规划设计与开发;
2. 负责平台软件在Linux平台接口的实现;
3. 负责平台移植,应用软件开发与移植,并配合其他工程师工作。
岗位要求:
1. 计算机或相关专业本科以上学历;
2. 熟悉C/C++开发, 1年以上C++开发经验;
3. 熟悉算法和数据结构
4. 熟悉Linux环境编程优先 ;
5. 良好的沟通能力,英语读写能力;
6. 具备良好的沟通能力和优秀的团队协作能力。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
10 [报告]
发表于 2011-08-30 14:44 |只看该作者
谁叫你不用自动指针……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP