Cppcheck说char [256]应该在构造函数的初始化列表中初始化

时间:2014-12-14 15:18:11

标签: c++ initialization c-strings initializer-list cppcheck

我已经使用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错了?或者还有其他方法可以解决它吗?

3 个答案:

答案 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而如果你不介意开销(这是除非构建此对象是您应用程序中真正具有性能关键的部分,否则最小甚至可忽略不计。