c++ - 为什么我的 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();
}
在这里,我正在访问数组超出范围,但它仍然继续..它以前从未发生过。我不能说这里有什么问题?
解决方案
第二个的行为
p->d=10;
是undefined。不崩溃是这种未定义行为的表现。(您可能会发现free
在您的特定情况下实际上并没有将内存还给操作系统。)a[5]=100;
也是未定义的。同样,您可能会发现 C++ 运行时库/操作系统已分配超过 3int
秒的内存。尽管有 (1) 和 (2),但您的程序未定义,因为您需要使用
int main()
. 同样,允许编译和运行时行为与您所获得的一致int main()
是未定义行为的表现。
推荐阅读
- sql-server - 从管道分隔的字符串中提取数据
- html - 为什么垂直对齐会影响前一个(相同范围)元素?
- node.js - Mongodb原生驱动超时生产值
- redis - 得分最高的 ZADD 成员
- ios - 有没有办法为 fastlane 下载的证书和配置设置目录?
- jquery - 以给定的时间间隔单击页面上的所有按钮
- html - 自定义html标签的默认css?
- angular2-forms - PrimeNg Angular2 自动完成 清除所有
- exception - 在闭包模板中调用 deltemplate 时出现奇怪的错误
- java - 在数组中找到 3 个数字的最小乘积 [代码错误?]