关闭

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

923人阅读 评论(0) 收藏 举报
分类:

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

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:266830次
    • 积分:3860
    • 等级:
    • 排名:第8281名
    • 原创:90篇
    • 转载:161篇
    • 译文:4篇
    • 评论:37条
    最新评论