zoukankan      html  css  js  c++  java
  • free 一个指针时【 retval = HeapFree(_crtheap, 0, pBlock);】报错的原因

    报错的位置

    void __cdecl _free_base (void * pBlock)
    {
    
            int retval = 0;
    
    
            if (pBlock == NULL)
                return;
    
            RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));
    
            retval = HeapFree(_crtheap, 0, pBlock);//最后一个箭头指到这儿,蛋疼!!!
            if (retval == 0)
            {
                errno = _get_errno_from_oserr(GetLastError());
            }
    }

    解决方案:

    方案1

    在运行结束后报错,基本都是内存释放的问题!

    释放了一个指针,这个指针所指的内存,不是用malloc等内存管理函数分配的内存。
    查看一下那个指针是啥东西。

    是否已经施行过加减运算,或者干脆就是随便拿过来的一个数值,
    或者一个不用释放的指针(指向局部变量的指针,指向全局变量的指针),
    甚至是野指针。

    方案2

    C,C++ 兼容的分配释放堆内存的函数:
    malloc,realloc 
    free 
    凡是malloc 分配成功的内存,一定要用free释放,这个只要求,内存地址不变就行,分配的指针的值是多少,释放是就必须还是多少。

    C++专用:
    由于C++分配和释放内存的运算符new delete会分别调用构造函数,析构函数;
    所以要求必须配对使用,并且 指针类型和指针的值,delete 的必须和 new的相同,不然就“有可能”不争取

    分配单个对象用 new, delete

    class A{....}; 
    A *pa=new A;//这里使用的是new 运算符!!
    ......          //这些代码,不可以改动pa的值
    delete pa;    //使用的是delete 运算符!!改动后这个释放就错了!

    分配对象数组用 new[],delete[];例如

    class A{....}; 
    A *pa=new A[10];//这里使用的是new[]运算符!!
    ......          //这些代码,不可以改动pa的值
    delete []pa;    //使用的是delete[]运算符!!改动后这个释放就错了!

    ew分配的用free释放 是错误的,同样,malloc 分配的用delete释放也是错误的!

    这里指的是,这样做逻辑上是错误的;
    非常可能会出错,并不是说一定会出错;

    但是不养成配对使用的习惯,很容易出错!!!!

    参考文章

    1. 在程序运行结束后(系统自动回收堆空间时报错)

  • 相关阅读:
    Akka详细介绍
    列举spark所有算子
    command not found所有执行命令总是报找不到
    Spark启动报错|java.io.FileNotFoundException: File does not exist: hdfs://hadoop101:9000/directory
    斐波那契数列的优化
    ganglia之web界面介绍
    linux环境下载和安装scala
    windows清空电脑的DNS缓存
    win10安装mysql一直卡在最后一步进行不下去
    maven的依赖管理详细
  • 原文地址:https://www.cnblogs.com/arxive/p/5278020.html
Copyright © 2011-2022 走看看