首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环中动态内存的简单使用会导致bad_alloc

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

Stack Overflow用户
提问于 2014-12-28 17:56:25
回答 2查看 298关注 0票数 3

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

代码语言:javascript
运行
复制
#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;
}

正如您在循环开始时看到的那样,我用新运算符分配了一些内存。我把它打印出来然后删除。如果我运行这段代码,它就能工作,但在某一时刻它会停止并抛出std::bad_alloc。

我不明白为什么会这样。它不应该耗尽内存,因为它每次都会用delete释放内存。如果有足够的内存让程序通过一次或两次循环,那么它就应该有足够的内存来无限期地循环。它只有32个字节。

我试着在两台不同的计算机上运行这个程序,每个计算机在中断之前执行不同数量的循环。

我做错了什么吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-28 18:21:22

我搞清楚出了什么问题。我正在使用来做一些事情,我意外地留下了选择用于测试的exe。并且由于启用了低资源模拟测试,它模拟了低内存条件。

我没有意识到,即使它的窗口关闭,验证器也能工作。当我试图用不同的参数编译程序并意外地更改了输出文件名时,我想可能就是它。更改文件名使程序工作,所以我记得之前我将验证器指向原来的exe。

我现在觉得很傻。

票数 4
EN

Stack Overflow用户

发布于 2014-12-28 18:06:53

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

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

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

我在我的电脑上测试了你的代码,我无法重现你的行为:

代码语言:javascript
运行
复制
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27679068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档