3

我已经用 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错了?还是有其他方法可以绕过它?

4

3 回答 3

6

我是一名 Cppcheck 开发人员。

该 cppcheck 警告是为未在构造函数中初始化的所有数据成员编写的。无论以后如何/是否使用成员。

要修复警告,您可以在构造函数中初始化数组。初始化第一个元素就足够了。例如,在您的构造函数中添加:

outStr[0] = 0;

或者如果你更喜欢:

sprintf(outStr, "");
于 2014-12-14T20:20:14.827 回答
4

我会避免在课堂上开始使用该字段。在固定大小的缓冲区中使用sprintf是不安全的(如果输出长度超过 255 个字符怎么办?),并且让数组在对象的整个生命周期中都存在以便在toStr函数返回时它仍然存在是很尴尬的。

考虑toStr改为返回一个std::string对象。这使得它的实现更简单——return id + ' ' + localId并且字符串对象将自动分配足够的内存来保存连接的结果。在调用 的代码中,如果您确实需要原始字符数组toStr,则可以调用返回的字符串。.c_str()

于 2014-12-14T17:17:00.620 回答
2

CppCheck 有点过分热心。但是,如果您使用 C++11 并且不介意开销(除非构造此对象的性能非常好,否则开销很小甚至可以忽略不计),您可以通过初始化该成员来关闭它并帮助防止事故发生-应用程序的关键部分)。

于 2014-12-14T17:51:53.063 回答