内存错误结果的解释[编译器行为]

时间:2017-09-14 01:42:30

标签: c++ compilation heap-memory

首先,这是一个关于编译器行为的问题,也不是为了纠正代码!

这是我的代码,但我无法向自己解释为什么我得到了这个结果。 我知道它有内存错误(删除其他范围内的指针以及之前的指针)但是最后一个元素的结果会出现问题。为什么最后一个元素只有原始生成的rand数字?

#include <iostream>

using namespace std;

void populate(int *arrayToPopulate, int arraySize);

int main() {
    int *ptr;
    ptr = new int[100];

    populate(ptr, 100);

    for (int i = 0; i < 100; i++)
        cout << ptr[i] << endl;

    return 0;
}

void populate(int *arr, int size) {
    for (int i = 0; i < size; i++) {

        arr[i] = rand() % 100 + 1;
    }

    delete [] arr;
}

结果:

  

8 50 74 59 31 73 45 79 24 10 41 66 93 43 88 4 28 30 41 13 4 70 10 58   61 34 100 79 17 36 98 27 13 68 11 34 80 50 80 22 68 73 94 37 86 46 29   92 95 58 2 54 9 45 69 91 25 97 31 4 23 67 50 25 2 54 78 9 29 34 99 82   36 14 66 15 64 37 26 70 16 95 30 2 18 96 6 5 52 99 89 24 6 83 53 67 17   38 39 2687021

2 个答案:

答案 0 :(得分:-2)

你最终得到的结果完全依赖于实现...我刚刚在MSVC 2015上运行并且在生成的序列范围之外得到了一堆随机的负数和正数。

答案 1 :(得分:-2)

正如Ryan建议的那样,你为main中的数组分配了内存。在populate()期间,您在填充main提供的数组后删除该数组。您不应该删除该数组。 数组按值传递,但通过引用传递。在函数populate()中,您没有可以删除的数组副本。它是在main中创建的实际数组。