Valgrind有条件的跳跃

时间:2017-04-30 10:57:08

标签: c++

所以我有一些有用的代码,但是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;
}

2 个答案:

答案 0 :(得分:0)

循环进行直到它在buffer数组中找到零,即它期望缓冲区以空值终止。您将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++;
}

这将确保您不会探测超过缓冲区末尾的位置为零。

答案 1 :(得分:0)

您可以使用

轻松初始化缓冲区
: maxLength(newLenth), buffer(new int[newLenth]{})
                                               ^^- note

这会使maxLength中的所有元素(buffer)初始化为int默认值(0)。