Valgrind:条件跳转,未初始化的值,C ++基本代码

时间:2016-09-23 17:37:00

标签: c++ valgrind

这是我的第一个问题,我目前正在学习C ++,而我正在研究如何使用Valgrind。该程序以71个错误开始,我已经能够将其最小化为2,由于我对C ++缺乏经验,我无法弄清楚剩下的问题。任何人都可以帮我弄清楚这里出了什么问题或者至少指出了我的方向吗?我理解错误告诉我的是什么,我只是没有看到这个问题。谢谢你的帮助。

以下是程序代码:

  #include <iostream>
  #include <cstdlib>
  using namespace std;

  int* initArray(int);
  int fillArray(int *, int);
  int* doubleArray(int *, int);
  void displayArray(int *, int);

int main(int argc, char ** argv){
    if (argc != 2){
        cout << "wrong number of arguments" << endl;
        exit(1);
    }

    int n = atoi(argv[1]);
    srand(time(0));

    int* ptr = new int[*initArray(n)];    //***Here is line 38***
    fillArray(ptr, n);
    displayArray(ptr, n);

    int* dptr = doubleArray(ptr, n);
    fillArray(ptr, 2*n);
    displayArray(ptr, 2*n);
}

int* initArray(int n){
    int arr[n];
    int *ptr = arr;
    return ptr;
}

int fillArray(int *ptr, int n){
    for(int i=0; i<n; i++){
        ptr[i] = rand() % 100;
    }
}

int* doubleArray(int * ptr, int n){
    int size = 2 * n;
    int * tmp = new int[size];
    ptr = tmp;
    delete [] tmp;
    return ptr;
    delete [] ptr;
}

void displayArray(int *ptr, int n){
    for(int i=0; i<n; i++){
        cout << ptr[i] << " ";
    }
    cout << endl;
}

这是我从valgrind输出的错误: http://i.imgur.com/881nsDw.png (它说我需要10次重新发布作为图片发布,抱歉!)

1 个答案:

答案 0 :(得分:0)

正如WhozCraig正确指出的那样,你的一个问题在于函数initArray。我不确定你想要实现什么,但对我而言,你可以简单地省略它并在第38行使用int* ptr = new int[n];

本质上,您返回指向堆栈上未启动内存的指针,然后尝试分配大小等于其指向的数据的数组。 Valgrid的消息告诉你。

但是在你惹恼UB(initArray)之后,你的程序在法律上可以做任何事情

但您的代码中存在更多错误:

  1. 在退出delete之前,您没有ptr指向main的数组。
  2. 您无法通过指定指针(ptr = tmp)来复制数组的内容。为此,您需要逐个遍历数组并复制元素。
  3. 您的陈述delete [] ptr;永远不会被执行。
  4. 一个一般性说明:如果学习指针不是您的目标,请避免使用它们 - 在您的情况下,正确的解决方案是使用std::vector