C++ Valgrind条件跳转

C++ Valgrind条件跳转,c++,C++,所以我有一些代码可以工作,但是valgrind说有一个条件跳转依赖于未初始化的值。我想我知道这是什么原因(见下文),但我不知道有任何替代方案/解决方案 class Vector{ private: int maxLength; int *buffer; void error(char* msg){ cerr << "Error: " << msg << endl;

所以我有一些代码可以工作,但是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;
    }
};
类向量{
私人:
int最大长度;
int*缓冲区;
无效错误(字符*消息){

cerr循环一直进行,直到它在
缓冲区
数组中找到零,即它期望缓冲区以null结尾。您将
1
放入初始元素,但紧随其后的元素仍保持未初始化状态

将零放入其中将解决此问题:

Vector v(10);
v[0] = 1;
v[1] = 0;
cout << v.length() << endl;

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

您可以使用

: maxLength(newLenth), buffer(new int[newLenth]{})
                                               ^^- note

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

在分配缓冲区后初始化缓冲区?
memset(buffer,0,sizeof(int)*newLenth);
这将在初始化列表之后进行,对吗?另外,我尝试了它,得到一个错误,说memset没有在这个范围内声明。它应该在{}之间进入构造函数体。
memset
memory.h
头声明。您需要将它包含到您的文件中。
for (int i = 0 ; i != maxLength && buffer[i] ; ++i) {
    count++;
}
: maxLength(newLenth), buffer(new int[newLenth]{})
                                               ^^- note