【问题标题】:Valgrind conditional jumpValgrind 条件跳转
【发布时间】:2017-04-30 10:57:07
【问题描述】:

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

【问题讨论】:

  • 分配后初始化缓冲区? memset(buffer,0, sizeof(int) * newLenth);
  • 那会在初始化列表之后,对吗?另外,我试了一下,得到一个错误,说 memset 没有在这个范围内声明。
  • 它应该进入构造函数主体,在 {} 之间。 memsetmemory.h 标头中声明。您需要将其包含到您的文件中。

标签: c++


【解决方案1】:

循环继续进行,直到在 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++;
}

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

【讨论】:

    【解决方案2】:

    您可以使用

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 2020-07-20
      • 2016-09-27
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2013-09-15
      相关资源
      最近更新 更多