C++编程中的error和可能的原因

原创 2013年12月05日 13:21:44

Error1:访问内存地址冲突

可能原因:数组越界

Error2:OpenCv Error:Insufficinet memory<Failed to allocate307200 bytes>in unknow function,file ..\..\..\src\opencv\modules\core\src\alloc.cpp,line 52

可能原因:内存泄露。比如在opncv里边,利用cvLoadImage打开了图像,却未采用cvReleaseImage释放之。

Error3:出现1.#INF000值

可能原因:数据溢出。可能有未初始化的数据参与运算。

Error4:读取位置0x0041458a 时发生访问冲突

可能原因:访问了不属于自己的内存空间。出现这种错误有几种原因:
1、给一个数组分配了比较小的内存空间,然后又给该数组赋了一个比较大的值,举例说明:
char buf[10];   
buf = "C++“读取位置 0x****** 时发生访问冲突”的可能原因C++“读取位置 0x****** 时发生访问冲突”的可能原因";  
这样才访问buf的时候,就会出现错误
解决方法:给数组分配更大一些的内存空间,如char buf[1000];
2、句柄或指针在使用前被释放
解决方法:检查代码配合调试,揪出野指针
Error5: test    dword ptr [eax],eax     ; probe page.
可能原因:局部数组变量定义超过所分配的最大空间,提示栈溢出。
所以解决此问题的方法就是扩大栈空间的大小: 项目->属性->链接器->系统->堆栈保留大小
注:这里填的是字节数,如果你想把他扩大为2M的话,1024*1024*2 = 2097152

Error6:expression must have pointer-to-object type

可能原因:定义的数组为一维数组,而在访问时却以二维数组的方式访问之。

Error7:1.#QNAN00
可能原因:类型定义不当,除数为0,指针使用错误。

#include <iostream.h>
int * re()
{
    int a[10];
    for(int i=0;i<10;i++)
    a[i]=i;
    return a;
}

void main()
{
    int *b;
    b=re();
    for(int i=0;i<10;i++)
    cout<<b[i]<<endl;
    delete[] b;
 }
输出为:


将re函数改为如下形式则正确:

int * re()
{
    int*a;
    a=new int[10];
    for(int i=0;i<10;i++)
    a[i]=i;
    return a;
}

函数里定义的 int a[10] 是个局部变量。生存期就函数那么短,等函数返回了,生存期就没了,外面的b接到了只是一个当时a数组的首地址,但那个数组现在已经没了,那片内存里现在还有什么就说不清了。这么写是很危险的,一般编译器可能会报类似“返回局部变量的地址”之类的警告,要避免写这样的代码。

Error8:BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

可能原因:当程序退出时,系统会收回分配的内存,于是调析构函数,由于内存已被错误地释放,于是就会出现“Debug Assertion Failed”的错误。

    这个assert说明什么问题呢?说明有一块内存在被释放的时候,它的头部里面的信息已经被改掉了,和预期的不一样。内存分配的程序往往在被分配出的内存块头部放上一些校验信息。这个信息内存的用户是不知道也不应该修改的。这样,在内存被释放的时候,内存分配程序就可以验对这个头部信息是否被改过了。若被改过,就说明发生了内存corruption. 这种corruption有两种可能性:1)有人在内存越界写东西;或者:2)这块内存已经被释放了,又被重复释放了一次。 (在第一次被释放中,是内存分配程序改掉了头部信息)。

    pHead_>nBlockUse就可能是空指针,或它指向的东西已经不存在了.

   根据上面的分析,说明一定和内存非配和释放有关系,然后再看调试信息

Detected memory leaks!

Dumping objects ->{366} normal block at 0x05785AD0, 152 bytes long. Data: << N    

 N x 7 > 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00  

这里说明是出现内存泄漏的问题了,于是这里就要借助相应的工具函数 _CrtSetBreakAlloc了

解决方法:

1. 在程序开始启动的地方(足够前的地方,只要在泄漏的内存分配的前面)使用代码:

_CrtSetBreakAlloc(366); //366为上面内存泄漏的块号.

2. 然后debug运行,程序自动断点在"内存块366"分配的位置:

如果提示 _CrtSetBreakAlloc 未定义,就再在头部加上

#define CRTDBG_MAP_ALLOC   
#include <stdlib.h>   
#include <crtdbg.h>   


3 .我们已经找到了泄漏的那块内存分配的底层操作的地方了(好拗口!).

这个时候我们利用 "调试" –> "退出" ,快捷键为:"Shift + F11" .

跳出当前函数..然后一直往"上"跳,边跳边查看调用栈.直到看到了自己写的代码

4 .这个时候我已经可以判断 origStream 分配了内存,但是没有合理释放.处理后再次运行就没有出现内存泄漏了.

5.最后,记得把_CrtSetBreakAlloc(366); 这句话删除掉,不然每次都断点,岂不是烦死..

Error9:内存位置0x01091f94处的std::bad_alloc

可能原因:内存不足以分配。

相关文章推荐

C/C++的#error

关于c/c++的#error, 自己用得不多, 一般在编译的时候才会用, 写个代码demo来看看: #define xyz "just for test" #ifdef xyz #error "wro...
  • stpeace
  • stpeace
  • 2016年05月15日 21:43
  • 1148

错误:fatal error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning

属性--配置属性-c/c++-预处理器 添加  _XKEYCHECK_H
  • SMF0504
  • SMF0504
  • 2016年07月27日 14:54
  • 1528

C/C++ #error、#pragma

[1]#error token-string(记号序列)将使预处理器打印包含该记号序列的诊断信息;Error directives produce compiler-time error messag...
  • p8x8x8
  • p8x8x8
  • 2011年06月07日 10:20
  • 3244

opencv Insufficient memory (Failed to allocate 1520000 bytes)解决办法

OpenCV Error: Insufficient memory (Failed to allocate 1520000 bytes) in unknown function, file ..\.....

C++编程所遇到的error(持续更新和补充)

这里提供本人在编程中遇到的问题,解决办法很多是搜集来的。对问题产生的原因和原理还不能完全阐述正确,还希望大家能够指正,谢谢大家!! 本人使用的编译器是:Visual Studio 2008...
  • meloyi
  • meloyi
  • 2015年08月19日 13:54
  • 577

关于android socket编程时,“Error:ShouldNotReachHere()”错误的原因

在android项目中实现Socket通信,服务器端使用main方法创建ServerSocket,运行启动服务器时报错“Error:ShouldNotReachHere()” 原因分析:java中使...

org.apache.hadoop.hdfs.DFSClient: Error Recovery for null bad datanode[0] nodes == null问题可能出现的原因

2014年-1-22日遇到了这个问题: 2014-01-22 14:36:18,346 WARN org.apache.hadoop.hdfs.DFSClient: Error Recovery fo...

undefined reference error 可能原因及解决办法

Linux下编译程序时,经常会遇到“undefined reference error” 报错,   这里总结一些可能的原因和解决方案,给需要的朋友:   说道undefine...

编译时出现fatal error C1853: "debug/xxx.pch" is not a precomplied header file with......错误的原因及解决办法(转)

错误原因: 该错误是因为当项目中混合了 .cpp 和 .c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。 在 VC++ 中,默认的...

error while loading shared libraries: xxx.so.x"错误的原因和解决办法

原文地址:  http://blog.chinaunix.net/uid-26212859-id-3256667.html 一般我们在Linux下执行某些外部程序的时候可能会提示找不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++编程中的error和可能的原因
举报原因:
原因补充:

(最多只允许输入30个字)