简单地在循环中使用动态内存会导致bad_alloc
Simple use of dynamic memory in loop causes bad_alloc
假设我有一个非常简单的循环,如下所示:
#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
我想出了什么问题。我正在使用Microsoft应用程序验证程序进行某些操作,但我不小心离开了选择进行测试的exe。由于启用了低资源模拟测试,因此它模拟了低内存条件。
即使关闭窗口,我也没有意识到验证器也可以工作。当我尝试使用不同的参数编译程序并意外更改输出文件名时,我想可能是这样。更改文件名使程序正常工作,所以我记得我之前将验证器指向原始 exe。
我现在觉得自己很傻。
你在问你是否做错了什么。
从技术上讲,您的代码具有未定义行为 (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
相关文章:
- 使用来自 Excel VBA 的 C++ dll 时"Bad DLL calling convention" - 如何解决?
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 对于代理容器上的迭代器来说,"least bad implementation"可能是什么?
- 组件对象模型 (COM):IMalloc::Alloc 在哪里分配内存?
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- 为什么 GetSystemMetrics (SM_CXVIRTUALSCREEN) 返回'bad'值?
- 将 lambda 传递给 STL 集时出错"bad function call"
- 新的 C++14 位分隔符处"Bad Character" Eclipse Oxygen 错误
- 使用 #define 被认为是"bad practice"吗?
- "400 Bad request"使用 OpenSSL BIO 进行请求时
- CGAL:Hausdorff距离不良Alloc
- 解密文件AES_256_CBC返回"bad decrypt"错误
- 在C++流中,eof(),fail(),bad()和good()有什么区别
- C STD ::初始化类对象中的Alloc错误错误
- make / gcc:"bad build"的可能原因是什么?
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 在多线程环境中,什么可能导致"bad file descriptor"?
- 尝试解决HackerBank上的BFS挑战时出现错误的alloc异常
- "std::vector"在调整大小时引发"bad allocation"异常
- 尝试使用 execp、dup2 和管道实现 shell,挂起或"bad file descriptor"