我已经使用cppcheck检查了我的代码,它说我的char outStr[256]
字段应该在构造函数的初始化列表中初始化。
warning: Member variable 'outStr' is not initialized in the constructor.
此字段仅用于此方法:
const char* toStr(){
sprintf(outStr,"%s %s", id.c_str(), localId.c_str());
return outStr;
}
将c("")
添加到初始化列表中会更好吗?还是cppcheck错了?或者还有其他方法可以解决它吗?
答案 0 :(得分:6)
我是Cppcheck开发人员。
为所有未在构造函数中初始化的数据成员编写cppcheck警告。无论以后如何使用这些成员。
修复警告,您可以在构造函数中初始化数组。初始化第一个元素就足够了。例如,在构造函数中添加它:
outStr[0] = 0;
或者如果您更喜欢这样:
sprintf(outStr, "");
答案 1 :(得分:4)
我要避免在课堂上开始这个领域。将sprintf
用于固定大小的缓冲区是不安全的(如果输出长度超过255个字符会怎么样?)并且在对象的整个生命周期中存在数组是很尴尬的,以便它在toStr
函数返回。
考虑更改toStr
以返回std::string
对象。这使得它的实现更简单 - return id + ' ' + localId
- 并且字符串对象将自动分配足够的内存来保存连接的结果。在调用toStr
的代码中,如果确实需要原始字符数组,则可以在返回的字符串上调用.c_str()
。
答案 2 :(得分:2)
CppCheck有点过于热心了。但你可以通过初始化该成员来关闭它并帮助预防事故,如果你正在使用C ++ 11而如果你不介意开销(这是除非构建此对象是您应用程序中真正具有性能关键的部分,否则最小甚至可忽略不计。