当前位置: 首页 > 面试题库 >

使用未分配的内存而不会出错?

郎雅昶
2023-03-14
问题内容

为什么行得通?

#include <iostream>
using namespace std;

int main() {
    float* tab[3];

    int i = 0;
    while(i < 3) {
        tab[i] = new float[3-i];
        i++;
    }

    cout << tab[2][7] << endl;
    tab[2][7] = 6.87;
    cout << tab[2][7] << endl;

    i = 0;
    while(i < 3)
        delete[] tab[i];
}

而这不是吗?

#include <iostream>
using namespace std;

int main() {
    float* tab = new float[3];

    cout << tab[7] << endl;
    tab[7] = 6.87;
    cout << tab[7] << endl;

    delete[] tab;
}

我在带有MS VS 2008的Win
XP上尝试了这两个程序,均已编译且没有错误,并且第一个程序运行无任何错误。第二个弹出一些错误窗口,但是我不记得它并且无法复制(此刻无法访问Windows)。

我还在具有g ++的Linux(Kubuntu 10.10,预编译的内核软件包版本2.6.35.23.25)上进行了尝试,并且可以编译并运行而没有任何错误。

为什么?是否应该出现诸如“错误地访问未分配的内存”之类的弹出窗口?

我知道它应该(并且幸运地)编译时没有错误,但是我认为它应该在没有错误的情况下运行…为什么第二个示例在Windows而不是Linux上出错?


问题答案:

使用未分配的内存会导致未定义的行为。即使在同一系统和编译器上执行此操作,也无法期望会发生什么,更不用说跨硬件和编译器的不同组合了。

该程序可能会立即崩溃,可能会工作一段时间,然后稍后失败,甚至可能会正常运行。

但是,访问您不拥有的内存总是一个编程错误。不要将正确操作的外观视为“有时会起作用”,而应将其视为“我真的很不幸,并且我的错误没有很快显示出来”。



 类似资料:
  • 实际上,我的问题和这个问题非常相似,但这篇文章只关注C#。最近我读到一篇文章,说java会将一些短类型(如short)提升到内存中的4字节,即使有些位不被使用,所以它不能减少使用。(是真的吗?) 所以我的问题是语言,特别是C、C++和java(正如Manish在这篇文章中谈到java时所说),如何处理小型数据类型的内存分配。参考资料或任何方法来找出它是首选的。谢谢

  • 我想了解为什么多次动态分配调用的数据比直接在代码中指定的或通过的单个调用分配的数据使用如此多的内存。 例如,我用C编写了以下两个代码: 测试1.c:int x用malloc分配 我在这里没有使用free来保持简单。当程序等待交互时,我查看另一个终端中的顶级功能,它向我显示了以下内容: test2. c: int x不是动态分配的 顶部显示: 我还编写了第三个代码,其结果与test2相同,我在tes

  • 在解析文本数据之后,我得到了。并且我需要搜索它是否存在于类型的变量中。没有到的会话,换句话说,没有分配是否可能? 我是否可以使用其他类型,并具有类似于的功能?

  • 问题内容: 使用以下Java选项启动Apache Tomcat(Atlassian Confluence)实例: 但是,我看到启动后,它很快就耗尽了虚拟服务器上可用的1GB内存中的大部分。 总消耗的内存(堆+ PermGen)是否不应该保持在使用- Xmx指定的值以下?这引起的问题之一是我无法使用关闭脚本关闭服务器,因为它试图生成具有256MB内存的JVM,该JVM因不可用而失败。 问题答案: T

  • 问题内容: 每次从stdin读取字母“ u”时,此代码段将分配2Gb,并且在读取“ a”后将初始化所有分配的字符。 我在具有3Gb内存的linux虚拟机上运行此代码。在使用htop工具监视系统资源使用情况时,我已经意识到malloc操作不会反映在资源上。 例如,当我仅输入一次“ u”(即分配2GB的堆内存)时,我看不到htop中的内存使用量增加2GB。只有当我输入“ a”(即初始化)时,我才会看到

  • 我使用5.6.21-70.0进行性能测试。 当我跑步时 mysqlslp-a--并发=40--查询次数1000次--迭代=500次--引擎=innodb--debug-info-utest-p 做一些性能测试,ram增长超过最大内存使用量,永不释放 当完成mysqlslap时,内存显示使用78% 我有1G物理内存,不使用交换 KiB Mem:总共1016656个,使用953808个,免费62848