它怎么能获得比我想要的更多的内存?(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++)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

libvirt-java怎么获得kvm虚拟机内存使用率

libvirt-java怎么获得kvm虚拟机内存使用率

operator new 如何知道内存已分配[重复]

将使用malloc制作的阵列传递给cuda

SLURM群集中的错误 - 检测到1个oom-kill事件:如何改进正在运行的作业

[引擎开发] 深入C++拷贝控制