为什么我的Visual C ++不会触发堆栈损坏错误堆栈损坏的情况

问题描述 投票:0回答:2

我有以下代码..

#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上之后触发什么......

它必须触发accssesing未引用指针的错误...但还是继续读,写...为什么这也是发生我这下面的代码..



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

    _getch();
}

我在这里访问数组越界,但仍继续..这从来没有发生过before.I不能说什么是错在这里吗?

c++
2个回答
6
投票
  1. 第二p->d=10;的行为是不确定的。不崩溃是不确定的行为的一种表现。 (您可能会发现,free实际上并没有给内存返回到操作系统在你的具体情况。)
  2. a[5]=100;是不确定的了。同样,你可能会发现C ++运行时库/操作系统已经超过3个ints分配的内存。
  3. 尽管有(1)和(2),因为你需要使用int main()你的程序是不确定的。再次,允许与你同int main()获得一致的编译和运行时的行为是未定义行为的一种表现。

1
投票

术语:栈和堆是不一样的东西。

堆栈用于静态内存分配:炭FOO [100];

堆用于动态存储器分配:字符*富= malloc的(100);

这是一个几年,因为我用VISUAL C ++。我似乎记得它编译和链接也许时间选项来检查内存问题。

在运行时,C / C ++运行系统要求从操作系统存储器,它得到大块的存储器,然后根据需要的C / C ++运行时代码切片它。当你一步是块之外,您可能会收到运行时错误。你可以随机获得其他错误。

当函数2()正确使用的是功能1()已损坏的内存块的那一部分,那么你已经损坏的堆栈或堆可能会得到奇怪的运行时错误。当你的程序中没有其他的部分使用相同的内存已损坏,那么很可能你不会看到任何错误。你的代码仍然有缺陷,但它不显示,直到你的代码的另一部分或C / C ++运行时注意到你踩它的变量。

© www.soinside.com 2019 - 2024. All rights reserved.