【C++】String赋值错误引发的一个Bug

String赋值错误引发的一个Bug

  • 某日在实现一个新功能时,在代码中很不起眼的一行,调用一个接口时将其一个为string类型的形参,赋值为0。
  • 编译通过,然后程序每次调用新功能时必Crash。
  • 之后,通过追加Log,反复查找。最终定位到传错参数类型的接口调用处。
// 错误示例
// some Code

if (NULL != obj) {
	// id message callbackid(string类型)
	// 第三个参数,为string,将其传入0
	obj->func(0, "Linduo", 0)
}

// somd Code
原因分析
  • 第一个,自然是敲代码时,不仔细。认为CallbackID是数字类型,有点想当然了。
  • 对于String,赋值为int类型,一般来讲,编译是无法通过的。
std::string s = 3;

编译时会报错:conversion from ‘int’ to non-scalar type ‘std::__cxx11::string {aka std::__cxx11::basic_string}’ requested

  • 但是对于数字0,这个东西比较特殊。0可以认为是一个空指针。
// 下面这三种是等效的,可以编译通过,但运行时会报错
std::string s = '\0';
std:string s = NULL;
std::string s= 0;

运行时报错:terminate called after throwing an instance of ‘std::logic_error’
what(): basic_string::_M_construct null not valid

  • 其实该错误,就是说不可以一块空的地址(指针)去构造string。String构造部分,这块的代码大体应该如下:
string(const char* str)
{
	// some code
	if (NULL == str) {
    	throw "terminate called after throwing an instance of 'std::logic_error'what():  basic_string::_M_construct null not valid";
    }
	// some code 
}
总结
  • 错误改正是很简单的,但找错误比较耗时。敲代码时一定要仔细,不可想当然。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值