首页 > 解决方案 > 为什么我的 Visual C++ 在堆栈损坏的情况下不会触发堆栈损坏错误

问题描述

我有以下代码..

#include "stdafx.h"
#include <stdlib.h>
#include <conio.h>

struct data

{
    int d;
};
void main()
{
    data *p=(data*)malloc(sizeof(data));
    p->d=10;
    free(p);
    p->d=10;

    _getch();
}

我预计在运行代码时会出现堆栈损坏错误,但 Visual Studio 什么也没触发……即使在释放 p 之后……

它必须触发访问未引用指针的错误......但它仍然继续读取和写入......为什么会发生这种情况我也有以下代码..



int a[]={1,2,3};
void main()
{
    a[5]=100;

    _getch();
}

在这里,我正在访问数组超出范围,但它仍然继续..它以前从未发生过。我不能说这里有什么问题?

标签: c++

解决方案


  1. 第二个的行为p->d=10;undefined。不崩溃是这种未定义行为的表现。(您可能会发现free在您的特定情况下实际上并没有将内存还给操作系统。)

  2. a[5]=100;也是未定义的。同样,您可能会发现 C++ 运行时库/操作系统已分配超过 3int秒的内存。

  3. 尽管有 (1) 和 (2),但您的程序未定义,因为您需要使用int main(). 同样,允许编译和运行时行为与您所获得的一致int main()是未定义行为的表现。


推荐阅读