Cstring - 调试断言失败; 缓冲太小了

Mad*_*adz 2 c++ mfc visual-studio-2008 visual-c++

我有这段代码在调试期间不断抛出"缓冲区太小"的错误.

        geoGraph.size=limit;
        CString xAxis ="X axis: ",yAxis="Y axis: ";

        for (int x = 0; x < limit; x++)
        {

            xAxis.Format(_T("%s%i  "),xAxis,(x+1));
            yAxis.Format(_T("%s%s  "),yAxis,dialog_test.str[x]);

        }

        xAxis.Format(_T("%s \n%s  "),xAxis,yAxis);// <---Error thrown

        d.SetWindowTextA(xAxis);
Run Code Online (Sandbox Code Playgroud)

我得出结论,错误是由于Cstring xAxis太小而无法包含新文本,我是否正确,如果是,我该如何解决?


谢谢.

编辑:我很好奇为什么这个错误只在调试期间显示,而不是在我使用'start without debugging'运行应用程序时(我使用VS2008).

xMR*_*MRi 9

没有!真正的问题是:

  1. xAxis格式启动并看到需要更多空间.基于给出Format的所有参数的计算.
  2. 现在重新分配xAxis存储.旧指针变为无效,并在调试版本中释放并覆盖它.所以不再有0终止符.内存中填充了可用内存的标准值.
  3. 格式从旧指针(它指向刚刚更改的内容)开始并收集并复制垃圾并找不到0终结符.

切勿在格式中使用CString作为目标AND源!这可能在Release Version中有效,因为Memory MIGHT不会被更改,但是如果它被更改,则行为是未定义的.但这是一个真正糟糕的编码错误.