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);

这2句都会造成程序的崩溃,因为并没有给pi分配能存储一个int变量的空间,所以一旦用到pi的int值时造成程序的崩溃,但这个程序在编译是并不报错。
一样的道理内存不能"Written"是*pi=103;这句没有空间当然也不能把103这个值写到内存里了。

void main() { int *pi; int i; pi=new int; *pi=11; delete pi; delete pi; }

这样重复释放分配的内存空间也回出错这个错误是: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