假设我有一个非常简单的循环:
#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 回答
我弄清楚出了什么问题 . 我正在使用Microsoft Application Verifier,我不小心将所选的exe留给了测试 . 由于启用了低资源模拟测试,因此模拟了低内存条件 .
即使窗口关闭,我也没有意识到验证器是否正常工作 . 当我尝试使用不同的参数编译程序并意外更改输出文件名时,我想它可能就是这样 . 更改文件名使程序工作,所以我记得我早先将验证器指向原始exe .
我现在觉得很傻 .
你在问你是否做错了什么 .
从技术上讲,您的代码有undefined behaviour(UB),因为您正在阅读尚未初始化的
c[0]
.除此之外,你的代码完全没问题 . 我怀疑奇怪的记忆行为即使在你修复了UB之后也会持续存在(请试试!)如果它确实存在,这意味着该问题与你的代码无关,可能是一个(相当奇怪的)属性您的编译器和/或运行时库 .
我在我的计算机上测试了你的代码,我无法重现这种行为: