0x00 前提
喝咖啡抠脚看着哈利波特,正当暗爽的时候,再自学c++的哥们突然丢了一个bug过来,还是截图的那种。内心是:卧槽,还让我手打代码啊。所以,在这里我有话要说,代码报错,是要有套路的,而不是上来就截图,让别人猜让别人在那里发懵。
多年提问秘术,在这里就无私奉献了:
1.错误代码,用记事本装好,打好注释标记,发给请教人;之后在通讯软件说明情况。
2.有错误,先自己看,确定核查不出来,再向有经验的人请教。
0x01 修正代码
void test03()
{
Person person[] = { Person("john", 20), Person("Smith", 22) };
cout << person[0].pName << person[0].mAge << endl;
cout << person[1].pName << person[1].mAge << endl;
/*首先这里就是一个语法错误,类对象它自己会调用虚构啊*/
//delete[] person;
}
class Person{
public:
Person()
{
cout << "无参构造" << endl;
pName = (char*)malloc(strlen("undefined") + 1);
/*当时我那哥们,没有写memset这一句,
既然+1不想手动处理\0,直接memset置0多好,万一系统给你的不是0,
那就是一个暗坑,写代码毕竟还是严格谨慎嘛
*/
memset(pName, 0, sizeof(pName));
strcpy(pName, "undefined");
mAge = 0;
}
Person(char* name, int age)
{
cout << "有参构造" << endl;
//pName = (char*)malloc(sizeof(name)); bug在这里
/*sizeof 指针变量,这命名申请堆空间对了嘛,还原到了错误现场,改代码就方便了
*/
pName = (char*)malloc(sizeof(char)* (strlen(name)+1));
memset(pName,0, sizeof(pName));
strcpy(pName, name);
mAge = age;
}
~Person()
{
cout << "调用析构" << endl;
if (pName != NULL){
/*既然没几行代码,就全部看一下,也发现了这个不好的习惯
释放了,就直接置上NULL嘛,养成好习惯.
*/
delete pName;
pName = NULL;//原先没有写
}
}
public:
char* pName;
int mAge;
};
0x02 经验总结
调试素来就是个人成长的必经之地,如何正确的来调试程序bug,瓜子这里就拿出经验来吹吹水。
1.心态,必须心态要好。毕竟不管是你自己的还是别人的坑,既然要埋,就埋的开开心心的,不然完全遮住眼睛,怎么能找出坑呢。
2.错误提示,一定要读懂给出的错误提示,虽然有时候错误提示不对,但至少有出处,先去看一看,也没有啥大事啊。
3.语法,不要对自己的语言掌握很自信,首先审视语言是否符合规范
3.二分法 + printf();大法,大致推测错误在哪里,来来来,打打输出调试信息,基本就可以找出来了。
4.错误总结,调试完。记得来一场错误总结,以前瓜子我老是不习惯做,现在算算,应该错过了很多次自我提高,光涨了经验。