我有以下代码..
#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不能说什么是错在这里吗?
p->d=10;
的行为是不确定的。不崩溃是不确定的行为的一种表现。 (您可能会发现,free
实际上并没有给内存返回到操作系统在你的具体情况。)a[5]=100;
是不确定的了。同样,你可能会发现C ++运行时库/操作系统已经超过3个int
s分配的内存。int main()
你的程序是不确定的。再次,允许与你同int main()
获得一致的编译和运行时的行为是未定义行为的一种表现。术语:栈和堆是不一样的东西。
堆栈用于静态内存分配:炭FOO [100];
堆用于动态存储器分配:字符*富= malloc的(100);
这是一个几年,因为我用VISUAL C ++。我似乎记得它编译和链接也许时间选项来检查内存问题。
在运行时,C / C ++运行系统要求从操作系统存储器,它得到大块的存储器,然后根据需要的C / C ++运行时代码切片它。当你一步是块之外,您可能会收到运行时错误。你可以随机获得其他错误。
当函数2()正确使用的是功能1()已损坏的内存块的那一部分,那么你已经损坏的堆栈或堆可能会得到奇怪的运行时错误。当你的程序中没有其他的部分使用相同的内存已损坏,那么很可能你不会看到任何错误。你的代码仍然有缺陷,但它不显示,直到你的代码的另一部分或C / C ++运行时注意到你踩它的变量。