Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在循环中简单使用动态内存会导致错误的分配_C++_Mingw_Dynamic Memory Allocation - Fatal编程技术网

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这个问题和答案可能对未来的研究有用,而且“不再能够复制”只是掩盖了原因。我不确定如何改进关于这一点的问题。@πάνταῥεῖ: 你不能,这就是为什么我投票关闭。