瓦尔格林德有条件跳跃
Valgrind conditional jump
所以我有一些有效的代码,但valgrind说有一个条件跳转取决于未初始化的值。我想我知道是什么原因造成的(见下文),但我不知道任何替代方案/解决方案。
class Vector{
private:
int maxLength;
int *buffer;
void error(char* msg){
cerr << "Error: " << msg << endl;
}
bool inBounds(int i){
return i>=0 && i < maxLength;
}
public:
Vector(int newLenth)
: maxLength(newLenth), buffer(new int[newLenth])
{
}
int & operator [] (int index){
if (!inBounds(index)){
error("Out of bounds");
}
return buffer[index];
}
int length(){
int count =0;
for (int i = 0; buffer[i];++i){
count +=1;
}
return count;
}
};
我认为问题是在 for 循环中,buffer[i] 没有"初始化"。我应该怎么做才能解决这个问题?(请达到 c++ 新手的水平)
int main(){
Vector v(10);
v[0] = 1;
cout << v.length() << endl;
}
循环进行,直到它在buffer
数组中找到零,即它期望缓冲区以 null 结尾。您将1
放入初始元素中,但紧随其后的元素保持未初始化状态。
将零放入其中将解决问题:
Vector v(10);
v[0] = 1;
v[1] = 0;
cout << v.length() << endl;
注意:您还应该通过在到达maxLength
时终止来确保循环安全:
for (int i = 0 ; i != maxLength && buffer[i] ; ++i) {
count++;
}
这将确保您不会探测缓冲区末尾的位置是否为零。
您可以使用
: maxLength(newLenth), buffer(new int[newLenth]{})
^^- note
这将使buffer
中的所有元素(其中maxLength
个)初始化为默认值(0
int
)。
相关文章:
- 如何使用 soong 命名空间来有条件地编译模块
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 根据模板类型有条件地删除变量
- 有条件地选择带有 decltype() 和三元运算符的类型
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 有条件的打印和计数在 std::map 上有限制
- 如何在 c++ 中有条件地包含标头?
- 如何仅在Qt是用ltcg构建时才有条件地启用ltcg?
- 如何在Visual Studio 2019中有条件地编译c++源文件
- C++可以有条件地向下转换类指针吗
- 使用 SFINAE 有条件地解析分配器成员
- 有条件地删除宏
- 有条件地包含C++标准库
- 如何有条件地将元素添加到 std::array - C++11
- 是否根据编译器版本有条件地包含源文件
- 有条件地启用类C++构造函数
- 我可以有条件地使用多个参数吗?
- 有条件地使用 Boost Python 添加模块
- 瓦尔格林德有条件跳跃
- Valgrind抱怨使用有条件跳跃,这些跳跃取决于非初始化的字节