首页 文章

在循环中简单使用动态内存会导致bad_alloc

提问于
浏览
3

假设我有一个非常简单的循环:

#include <iostream>

int main() {
    int i = 0;
    while (1)
    {
        char* c = new char[32];

        std::cout << i << " " << c[0] << std::endl;

        delete[] c;
        i++;
    }
    return 0;
}

正如您在循环开始时所看到的,我使用new运算符分配了一些内存 . 我打印出来并删除它 . 如果我运行此代码它可以工作,但在某一点它停止并抛出std :: bad_alloc .

我不明白为什么会这样 . 它不应该耗尽内存,因为每次删除它都会释放它 . 如果有足够的内存让程序经过一次或两次循环,它应该有足够的内存使它无限循环 . 它只有32个字节 .

我尝试在两台不同的计算机上运行它,每个计算机在中断之前执行不同数量的循环 .

难道我做错了什么?

编辑:我在Windows 8上使用mingw g(gcc)4.8.1

2 回答

  • 3

    我弄清楚出了什么问题 . 我正在使用Microsoft Application Verifier,我不小心将所选的exe留给了测试 . 由于启用了低资源模拟测试,因此模拟了低内存条件 .

    即使窗口关闭,我也没有意识到验证器是否正常工作 . 当我尝试使用不同的参数编译程序并意外更改输出文件名时,我想它可能就是这样 . 更改文件名使程序工作,所以我记得我早先将验证器指向原始exe .

    我现在觉得很傻 .

  • 4

    你在问你是否做错了什么 .

    从技术上讲,您的代码有undefined behaviour(UB),因为您正在阅读尚未初始化的 c[0] .

    除此之外,你的代码完全没问题 . 我怀疑奇怪的记忆行为即使在你修复了UB之后也会持续存在(请试试!)如果它确实存在,这意味着该问题与你的代码无关,可能是一个(相当奇怪的)属性您的编译器和/或运行时库 .

    我在我的计算机上测试了你的代码,我无法重现这种行为:

    Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
    Target: x86_64-apple-darwin13.4.0
    

相关问题