记忆错误结果的说明[编译器行为]
Explanation for a memory error result [compiler behavior]
首先,这是关于编译器行为不纠正代码的问题!
这是我的代码,但我无法向自己解释为什么我得到了这个结果。我知道它具有内存错误(在其他范围内删除指针,然后使用它之前),但是结果唯一的对于最后一个元素会出现问题。为什么最后一个元素只有生成的 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
您最终得到的结果完全取决于实现...我只是在MSVC 2015上跑来跑去,并在生成序列的范围之外获得了一堆随机的负和正数。
正如瑞安(Ryan)所建议的那样,您在主机中分配了内存。在pupulate()期间,您将在填充Main提供的数组后删除该数组。您不应该删除该数组。数组按值传递,但通过引用传递。在函数填充()中,您没有可以删除的数组副本。这是在main中创建的实际数组。
相关文章:
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 当使用通配符和null指针调用函数时,对输出的说明
- 编译器指出结构和 int 说明的错误 2059
- 为什么编译器复制一些说明
- 不同编译器版本的C++中的奇怪行为(字符串通过引用传递):参见简单的程序说明
- 记忆错误结果的说明[编译器行为]
- 编译器说明重新排序
- 奇怪的编译器错误,说明我的迭代器未定义
- visualstudio2010-有没有一个列表,说明哪些编译器支持C++标准的哪一部分