字符串堆空间释放报错bug

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.错误总结,调试完。记得来一场错误总结,以前瓜子我老是不习惯做,现在算算,应该错过了很多次自我提高,光涨了经验。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值