“CRT 检测到应用程序在堆缓冲区结束后写入内存”是啥意思?

Posted

技术标签:

【中文标题】“CRT 检测到应用程序在堆缓冲区结束后写入内存”是啥意思?【英文标题】:What does "CRT detected that the application wrote to memory after end of heap buffer" mean?“CRT 检测到应用程序在堆缓冲区结束后写入内存”是什么意思? 【发布时间】:2014-07-25 05:07:13 【问题描述】:

我在处理这段代码时遇到了问题。它在 free(q->izv) 函数处中断,我收到一个调试错误:

CRT detected that the application wrote to memory after end of heap buffer

我不知道这意味着什么,所以如果我得到任何帮助,我将不胜感激。

    typedef struct izvodjaci
        char *izv;
        int broj;
        struct izvodjaci *sled;
    IZV;

    obrisi_i(IZV *p)
        while (p)
            IZV *q;
            q = p;
            p = p->sled;
            if (!strcmp(q->izv,"UNKNOWN")) free(q->izv);
            free(q);
        
    

提前致谢

【问题讨论】:

这可能只是刚刚检测到缓冲区溢出的地方,而不是实际发生的地方。假设您没有首先发现问题,请尝试将您的整个代码缩减为复制问题的小示例并将其发布在此处。 【参考方案1】:

“CRT 检测到应用程序在堆缓冲区结束后写入内存”是什么意思?

假设你分配了一个堆缓冲区:

char* buffer = malloc(5);

好的,buffer 现在指向堆上的五个字符。

假设您将六个字符写入该缓冲区:

buffer[0] = 'a';
buffer[1] = 'b';
buffer[2] = 'c';
buffer[3] = 'd';
buffer[4] = 'e';
buffer[5] = '\0';

你现在已经破坏了堆;你只能写五个字符,你写了六个。

现在允许该程序执行任何操作。它可以正常工作,它可以崩溃,它可以将你所有的密码发送给中国的黑客,任何东西

您的实现显然选择了最佳选择,即“通知您您犯了一个错误”。你应该非常、非常高兴这是发生的事情,而不是任何可怕的选择。不幸的是,它会通知您何时释放缓冲区,而不是何时您犯了错误,但很高兴您得到了一个错误。

【讨论】:

谢谢。你是对的。我算错了,我使用的空间比分配的空间多。 我几乎重写了所有内容,除了...这是我第一次犯这个错误,所以我之前没有看到那个错误消息,所以我有点恐慌。感谢您的提示。 嗨,埃里克,这太棒了。我在从 src char* 复制到 dest char* 时使用了 strlen。你能告诉我为什么 Visual Studio 编译器会在空闲时发现这个损坏问题,而不是在我最终写出内存边界时。 @user1874627:这是一个针对实际代码的特定问题的问答网站,您所了解的是关于实际代码的特定问题,因此我鼓励您 (1)搜索以查看是否已经回答,如果没有(2)发布问题! @user1874627:如果您在开始时遇到问题,这里有一个更简单的问题。假设您正在生成代码以检测对内存缓冲区中任意偏移量的越界写入,但您知道偏移量来自缓冲区的开头。在这种情况下,您将如何编写写越界检测?这两个问题都可以解决,但这个问题要容易得多。

以上是关于“CRT 检测到应用程序在堆缓冲区结束后写入内存”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

看似不错的删除 [] 程序崩溃

删除 3D 矩阵 c++