你好获取登录信息中




首页 主站 文章列表 分类列表
查看文章返回文章列表

谈谈写C++时踩的坑

发布时间:2019-04-20 18:53:01 by:



本来是在手机上写的,在前面有一段背景介绍的,但是 手机崩了,懒得再写了,所以干脆开门见山吧。 首先,说一个不是坑的坑——内存的分配与释放。C/C++都是挺接近硬件的语言,它是不能完全自动管理内存。在函数(含参数)或语句块中直接定义的变量实际上是入栈操作,当变量被定义时入栈,执行完毕时出栈,同时变量名转成在栈中的便宜量。因为定义的变量在编译时就已经确定,一个萝卜一个坑,所以这样管理是没有问题。但是,如果编译时不能确定的东西呢?还有栈的大小一般都挺小的。所以这时候就需要动态分配内存函数malloc。但是,这种东西是被指针指向的,而这指针可以在任何地方,更可以有很多个同时指向同一个。这样一来编译器最多只能自己处理指针本身,对于被指向的内存就无法确定是否可以回收,只能在程序中使用free释放。对越C++中的class,其实也是一样的,在new的时候相当于malloc了一块这个类的一个实例所需要的内存,并调用构造函数初始化。在使用完毕后同样需要释放掉,这个时候需要用delete,这玩意就相当于调用析构函数并使用free。而析构函数中则应该delete它分配的内存,释放文件指针之类的东西。~~我以前的教务管理新系统客户端就没做这个delete实在不是一个好习惯。~~ 第二个坑就是c++成员函数与实例没有直接关系。当你手里有个野指针的时候你是可以正常访问其该类型的成员函数,但是一旦调用其变量(包括在成员函数中和直接在外部用野指针访问)就会发生奇怪的情况然后引起程序崩溃。我得出的结论是成员函数与类本身是独立的,只是会隐含的传入一个名叫this的同其所属类类型一直的指针作为参数。这个问题在未对指针初始化或初始化有错误的情况下产生,导致程序崩溃,由于编译器无法检测此问题他只会在运行时程序忽然崩溃,并且成员函数中使用qDebug能输出信息,我花费了大量的时间才找到这个错误,在调试时应当输出下this指针指向的地址来确定是否有此情况。 第三个需要说到的坑可能一般都不会有人去踩,但是还是说一下。就是当初我为了图方便就在头文件里面把某个抽象类的一个函数体也写上了,作为默认的情况,然后就报错了。而且还是奇奇怪怪的错误,完全根据错误提示完全找不到问题所在。所以不要偷懒。 第四个坑,也并不完全算坑吧,但是挺容易踩的。就是做多态的时候,第一个,只能子类的继承必须写public公开继承(不是准本学C++的,不是很懂为啥会有这种设定),否则,无法转换为父类。另外析构函数必须声明为虚函数,否贼delete的时候不会调用子类的析构函数,引起内存泄漏。 好吧坑差不多就是这些吧,有空再说说我写的那个人工智障AI的趣事吧。

评论
    还没有评论
发表评论
正在等候用户中心返回数据
杂项
。。。