假设我有这样一个非常简单的循环:
#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
发布于 2014-12-28 18:21:22
我搞清楚出了什么问题。我正在使用来做一些事情,我意外地留下了选择用于测试的exe。并且由于启用了低资源模拟测试,它模拟了低内存条件。
我没有意识到,即使它的窗口关闭,验证器也能工作。当我试图用不同的参数编译程序并意外地更改了输出文件名时,我想可能就是它。更改文件名使程序工作,所以我记得之前我将验证器指向原来的exe。
我现在觉得很傻。
发布于 2014-12-28 18:06:53
你是在问你是否做错了什么。
从技术上讲,您的代码具有未定义行为 (UB),因为您正在阅读尚未初始化的c[0]。
除此之外,您的代码是非常好的。我怀疑即使在您修复了UB之后,这种奇怪的内存行为也会持续存在(请尝试!)如果它确实持续存在,这意味着该问题与您的代码无关,可能是编译器和/或运行时库的一个(相当奇怪的)属性。
我在我的电脑上测试了你的代码,我无法重现你的行为:
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0https://stackoverflow.com/questions/27679068
复制相似问题