VC中编译通过运行时出现该内存不能为“read”或“written”
来源:互联网 发布:js获取某个标签 编辑:程序博客网 时间:2024/06/03 14:32
分析1:
在退出程序时经常有内存不能"read"或内存不能"written"的时候。内存不能"read"意思就是不能读取内存中的数据的意思造成这个错误的原因是没有给变量分配内存空间,而又用到该变量造成的例:
void main() { int *pi; int i; i=*pi; printf("%d\n",*pi); *pi=103;} i=*pi;printf("%d\n",*pi);
1、退出的时候,系统会回收资源,你这时候,如果有new出来的内存,没有delete掉的话,有可能出现。
2、还有一个就是访问已经销毁的资源,比如某个窗体,已经被销毁了,但是你退出的时候。继续有程序向其发消息,这样就会使用无效的空句柄,导致访问空资源引发崩溃。
3、向前面一篇所说的指针指向空了。
================================
*p=1; //不能修改其内容
2.void f() //不明白啊
{
throw;
}
3.void f()//无穷递归
{
f();
}
//类似的例如死循环都可以
struct A
{
A(){new A;}
};
int main ()
{
A a;
return 0;
}
4.char * pStr = "12345";
*(pStr + 2) = 'd'; //修改字符串常量
总结:
几个核心重点:1堆满 2栈溢出 3指向内核代码区的指针内容操作 4数组指针的一切非法操作
几个主要方式:1无穷递归 2强制类型转换(隐式也可) 3狂NEW或狂DELETE 4取个随机的指针数值变着玩
参考文章:http://topic.csdn.net/u/20081027/23/dfbb554c-2593-462a-9698-5ba4b7f48e36.html
查错与解决方法:
1、 捕捉所有异常(没用过)
try
{}
catch(...)
{}
2、操作指针之前(经常忘记)
if(p) 一下,检查是否为空指针。
3、Debug运行,查看CallStack(不会)
4、用Purify等内存检测工具检测内存泄漏(没用过)
5、查看MAP文件(不会,稍后转相关几篇文章)
在退出程序时经常有内存不能"read"或内存不能"written"的时候。内存不能"read"意思就是不能读取内存中的数据的意思造成这个错误的原因是没有给变量分配内存空间,而又用到该变量造成的例:
void main() { int *pi; int i; i=*pi; printf("%d\n",*pi); *pi=103;} i=*pi;printf("%d\n",*pi);
这2句都会造成程序的崩溃,因为并没有给pi分配能存储一个int变量的空间,所以一旦用到pi的int值时造成程序的崩溃,但这个程序在编译是并不报错。
一样的道理内存不能"Written"是*pi=103;这句没有空间当然也不能把103这个值写到内存里了。
这样重复释放分配的内存空间也回出错这个错误是:Debug Assertion Failed!
但前面三种情况在Release版本里没有
void main() { int *pi; *pi=11; printf("%d\n",*pi);}如果没有赋值语句打印出的结果是0,说明在Release里先给指针分配了一个空间。这个还有待研究!
转:blog.csdn.net/Ghost90/archive/2008/12/04/3445791.aspx
分析2:1、退出的时候,系统会回收资源,你这时候,如果有new出来的内存,没有delete掉的话,有可能出现。
2、还有一个就是访问已经销毁的资源,比如某个窗体,已经被销毁了,但是你退出的时候。继续有程序向其发消息,这样就会使用无效的空句柄,导致访问空资源引发崩溃。
3、向前面一篇所说的指针指向空了。
================================
网上找到一篇《一句话让程序崩溃》的文章,也有助于分析原因。
1.int *p=0; //p指向了系统专用区了*p=1; //不能修改其内容
2.void f() //不明白啊
{
throw;
}
3.void f()//无穷递归
{
f();
}
//类似的例如死循环都可以
struct A
{
A(){new A;}
};
int main ()
{
A a;
return 0;
}
4.char * pStr = "12345";
*(pStr + 2) = 'd'; //修改字符串常量
总结:
几个核心重点:1堆满 2栈溢出 3指向内核代码区的指针内容操作 4数组指针的一切非法操作
几个主要方式:1无穷递归 2强制类型转换(隐式也可) 3狂NEW或狂DELETE 4取个随机的指针数值变着玩
参考文章:http://topic.csdn.net/u/20081027/23/dfbb554c-2593-462a-9698-5ba4b7f48e36.html
查错与解决方法:
1、 捕捉所有异常(没用过)
try
{}
catch(...)
{}
2、操作指针之前(经常忘记)
if(p) 一下,检查是否为空指针。
3、Debug运行,查看CallStack(不会)
4、用Purify等内存检测工具检测内存泄漏(没用过)
5、查看MAP文件(不会,稍后转相关几篇文章)
文章来源:http://hi.baidu.com/uvpvxaagmlbfimq/item/a8622673c357c23470442301
0 0
- VC中编译通过运行时出现该内存不能为“read”或“written”
- 出现:0x???????? 指令引用的0x????????内存。该内存不能为"read"或"written"
- 该内存不能为read或written的解决方案
- 该内存不能为read或written的解决方案
- 推荐]该内存不能为“read”或“written”的解决方案!
- 该内存不能为read或written的解决方案
- 该内存不能为read或written的解决方案
- 该内存不能为read或written的解决方案
- 该内存不能为read或written的解决方案
- 解决该内存不能为read或written
- 该内存不能为read或written的解决方案
- 系统出现内存不能为"Read"或"written"的原因
- 系统出现内存不能为"Read"或"written"的原因
- 经常出现“内存不能为read或written”等错误
- 电脑使用过程中“xx指令引用的xx内存。该内存不能为written或read”的解决方案!
- “0x????????”指令引用的“0x????????”内存。该内存不能为“read”或 written
- “0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”
- “0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”
- 《Head First 设计模式》之状态模式
- error LNK2019: 无法解析的外部符号
- [数据结构] 图的邻接表拓扑排序实现
- Windows Server 2003 Key
- C# 线程手册 第三章 使用线程 实现一个数据库连接池(实战篇)
- VC中编译通过运行时出现该内存不能为“read”或“written”
- [BZOJ 2732][HNOI 2012]射箭(半平面交)
- 《C语言及程序设计》实践参考——另类求和
- Android—什么是ANR 如何避免它?
- 堆排序
- PCB设计笔记--1
- 适配器仿真潜在类型机制
- 1182 统计单词
- Linux--写一个简单的模块