它怎么能获得比我想要的更多的内存?(C++)[重复]
Posted
技术标签:
【中文标题】它怎么能获得比我想要的更多的内存?(C++)[重复]【英文标题】:How could it get more memory than I wanted?(C++) [duplicate] 【发布时间】:2014-12-09 16:27:32 【问题描述】:我想取一个 1 整数的内存,但是这个程序是怎么工作的呢?
代码:
#include<iostream>
using namespace std;
int main()
int* k=new int[1];
for(int i=0;i<5;i++)
cin>>k[i];
for(int i=0;i<5;i++)
cout<<k[i]<<"\n";
delete[] k;
return 0;
输入:
999999
999998
999997
999996
999995
输出:
999999
999998
999997
999996
999995
【问题讨论】:
它没有得到比你想要的更多的内存。您调用了未定义的行为并通过写入您未分配的地址继续memory stomp。 @Cyber:他完全有可能获得了比他想要的更多的内存,但未定义的行为/内存踩踏仍然适用。 你有undefined behavior,因为你写和读超出了你分配的内存,这意味着你的整个程序是无效的。 感谢您提前回答@Cyber。但它是否一直都在发生? @ZeRoHuK -But does it happen all the time?
what 是否一直在发生?
【参考方案1】:
您通过访问未分配的内存调用了未定义的行为。这纯粹是“偶然”的。从字面上看,你程序的每一个行为都是合法的,包括程序订购比萨饼,......
这在大多数情况下可能会在实践中起作用,因为您的操作系统通常不仅会给您 4 字节或类似的东西,而是给您一整页内存(通常是 4kB),但要强调这一点:您永远不能依赖这种行为!
【讨论】:
【参考方案2】:c++ 程序使用数组的方式是,它是你想要的索引,将它乘以组成数组的元素的大小,然后将它添加到数组中的第一个内存位置。碰巧你把它放在你的程序中,返回额外的 4 个元素并没有破坏任何东西,所以你很好。它实际上并不在乎。但是,如果您覆盖另一个变量或堆栈指针,那么您就会遇到麻烦。但是,我不建议在实践中这样做,因为行为可能是未定义的。
【讨论】:
以上是关于它怎么能获得比我想要的更多的内存?(C++)[重复]的主要内容,如果未能解决你的问题,请参考以下文章