C++ 在循环中简单使用动态内存会导致错误的分配
假设我有一个非常简单的循环,如下所示:C++ 在循环中简单使用动态内存会导致错误的分配,c++,mingw,dynamic-memory-allocation,C++,Mingw,Dynamic Memory Allocation,假设我有一个非常简单的循环,如下所示: #include <iostream> int main() { int i = 0; while (1) { char* c = new char[32]; std::cout << i << " " << c[0] << std::endl; delete[] c; i++; } re
#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;
}
#包括
int main(){
int i=0;
而(1)
{
char*c=新字符[32];
你在问自己是否做错了什么
从技术上讲,您的代码在读取未初始化的c[0]
后已经(UB)
除此之外,您的代码非常好。我怀疑即使在您修复了UB(请尝试!)之后,这种奇怪的内存行为也会持续存在。如果它确实持续存在,这意味着该问题与您的代码无关,可能是编译器和/或运行库的一个属性(相当奇怪)
我在我的计算机上测试了你的代码,但我无法重现以下行为:
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
我发现了问题所在。
我正在使用Microsoft Application Verifier进行某些操作,但无意中选择了exe进行测试。
由于启用了低资源模拟测试,它模拟了低内存条件
我没有意识到即使关闭了验证程序的窗口,它也能工作。我想可能是在我试图用不同的参数编译程序时,不小心更改了输出文件名。
更改文件名使程序工作,所以我记得我在前面将验证器指向原始的exe
我现在觉得很傻。确定这就是你在这里展示的吗?@πάνταῥεῖ 是的,我将在结尾添加int main并返回0以说明这一点。无法复制。请指定您的平台、编译器版本和编译/链接选项。此代码段具有未定义的行为,因为您没有首先写入c[0]。@Adam27X否。您需要添加()
对数组进行值初始化。奇怪的属性名为bug:)@doc:我个人倾向于同意。但是,考虑到它可能没有违反任何规范,这是一个值得讨论的问题(我将排除在这场辩论之外:)。我投票结束这个问题,因为“不再能够复制”因为,嗯,事实就是这样。但是你应该接受这个答案,我给你的答案是+1,而且做得很好。@doc我试过了,但它说“你可以在两天内接受你自己的答案”。@quipe:对,两天内就可以了!@LightnessRacesinOrbit这个问题和答案可能对未来的研究有用,而且“不再能够复制”只是掩盖了原因。我不确定如何改进关于这一点的问题。@πάνταῥεῖ: 你不能,这就是为什么我投票关闭。