c++ - 为什么这段代码会破坏内存?

标签 c++ memory-corruption

这是一个相当新的问题,应该很快就能回答...

基本上,在 echo 中第一次调用 Printf 后,args 的内容已损坏。在我看来,我好像错误地传递了指针。但是想不通为什么?

#define MAX_PRINT_OUTPUT 4096

void Echo(char *args[MAX_COMMAND_ARGUMENTS], int argCount)
{
    for (int i = 1; i < argCount; ++i)
    {
        Printf("%s ", args[i]);
        Printf("\n");
    }
};

void Printf(const char *output, ...)
{
    va_list args;
    char formattedOutput[MAX_PRINT_OUTPUT];

    va_start(args, output);
    vsnprintf(formattedOutput, sizeof(formattedOutput), output, args);
    va_end(args);

    g_PlatformDevice->Print(formattedOutput);
};

void RiseWindows::Print(const char *output)
{
    //Corruption appears to occur as soon as this function is entered
    #define CONSOLE_OUTPUT_SIZE 32767

    char buffer[CONSOLE_OUTPUT_SIZE];
    char *pBuffer = buffer;
    const char *pOutput = output;
    int i = 0;

    while (pOutput[i] && ((pBuffer - buffer) < sizeof(buffer) - 1))
    {
        if (pOutput[i] == '\n' && pOutput[i+1] == '\r' )
        {
            pBuffer[0] = '\r';
            pBuffer[1] = '\n';
            pBuffer += 2;
            ++i;
        }
        else if (pOutput[i] == '\r')
        {
            pBuffer[0] = '\r';
            pBuffer[1] = '\n';
            pBuffer += 2;
        }
        else if (pOutput[i] == '\n')
        {
            pBuffer[0] = '\r';
            pBuffer[1] = '\n';
            pBuffer += 2;
        }
        else
        {
            *pBuffer = pOutput[i];
            ++pBuffer;
        }
        ++i;
    }
    *pBuffer = 0;

    SendMessage(this->ConsoleWindow.hwndBuffer, EM_LINESCROLL, 0, 0xffff);
    SendMessage(this->ConsoleWindow.hwndBuffer, EM_SCROLLCARET, 0, 0);
    SendMessage(this->ConsoleWindow.hwndBuffer, EM_REPLACESEL, 0, (LPARAM)buffer);

};

注意这不是生产代码,只是概念验证。
编辑 g_PlatformDevice 是 RiseWindows 类型,如果不清楚的话...
编辑这是在vs2008下运行的windows xp平台

更新 对于任何感兴趣的人来说,问题似乎是调用堆栈溢出,在堆栈的更下方,然后定义了另一个大数组。重构这消除了内存损坏。所以用粉笔写成堆栈重击!

最佳答案

你没有提到这段代码在什么环境下运行。可能是你输光了筹码。您在 RiseWindows::Print 的堆栈上声明了一个 32767 字节的数组。在我熟悉的某些嵌入式系统环境中,这将是个坏消息。您是否可以增加堆栈大小和/或在堆上分配该缓冲区来测试该理论?您可能希望将该缓冲区改为 std::vector,或者可能是一个私有(private)成员 vector ,以避免每次调用 Print 时都分配和重新分配它。

按照这些思路,MAX_PRINT_OUTPUT 有多大?

关于c++ - 为什么这段代码会破坏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/614842/

相关文章:

c - 指向指针数组的段错误和内存损坏

Java volatile变量影响其他非volatile变量的内存一致性

c - 为什么 malloc 会在这里引发内存损坏?

c++ - Cgal二次规划目标函数

c++ - 使用 TinyXML 解析 XML 元素

c++ - 为什么点击编辑框会关闭win32窗口(C++)?

c - 由于用 C 实现的 erl_interface 库导致内存损坏

c++ - 从返回类型为 'void' 的函数获取结果,而结果变量是输入参数之一 - C++

c++ - 在加载和保存期间缺少 DirectX 中 PNG 纹理的某些颜色?

c - Visual C++ 2010 堆损坏