free 一个指针时【 retval = HeapFree(_crtheap, 0, pBlock);】报错的原因

news/2024/7/20 15:05:29 标签: c/c++, 内存管理

 

报错的位置

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. 在程序运行结束后(系统自动回收堆空间时报错)

转载于:https://www.cnblogs.com/arxive/p/5278020.html


http://www.niftyadmin.cn/n/558157.html

相关文章

命令行错误: 无法打开 元数据 文件 platform.winmd_CAD打开图纸的方法汇总

打开文件属于最基本的操作,大家都会,但每个人的习惯不一样,采用的方法也不完全相同,这里简单地将打开文件的各种方法汇总一下。一、打开(OPEN)命令这是最基本也是最常用的方法,但调用方法有很多种,可以从菜…

用tcpdump分析tcp三次握手,四次挥手

1.tcpdump 简介 tcpdump是一个对网络上的数据包进行截获的包分析工具,一般linux系统以命令的形式使用 2.tcp三次握手 建立一个tcp连接会发生下面三个过程: 1.服务器必须准备好接受外来的连接,一般是调用socket,bind,listen三个函数完成 2.客户…

mysql的decimal类型_MySQL数据类型decimal(m,d)的说明

关于MySQL数据类型decimal(m,d)的说明,自己亲测一遍:create table decimal_test(id int auto_increment PRIMARY key,score decimal(5,2) -- 取值范围是 -999.99 到 999.99);-- 整数的位数必须小于等于m-d,不然报错。小数的位数可以大于d位。…

thread

public class thread的 extends Thread {public void run(){for(int i0;;i){try {Thread.sleep(100);} catch (InterruptedException e) {// TODO 自动生成的 catch 块e.printStackTrace();}System.out.println("好无聊啊"i);if(i10){break;}}}public static void ma…

mysql缓冲池_详解MySQL中的缓冲池(buffer pool)

Mysql 中数据是要落盘的,这点大家都知道。读写磁盘速度是很慢的,尤其和内存比起来更是没的说。但是,我们平时在执行 SQL 时,无论写操作还是读操作都能很快得到结果,并没有预想中的那么慢。可能你会说我有索引啊&#x…

网络自动切换

一、描述 工作中会需要在同一台电脑上使用不同的网络,但又不能同时连接多个网络,只允许连接单独的某个网络,如:公司内网和外网, 此时需要一个网络自动切换的功能,当用网线连接内网时,自动的断开…

学习笔记 mysql_Mysql个人学习笔记

#进阶4:常见函数概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名好处:1、隐藏了实现细节 2、提高代码的重用性调用:select 函数名(实参列表) 【from 表】;特点:①叫什么(函…

《Linux内核设计与实现》 第三周 读书笔记

第一章 Linux内核简介 1. Unix的历史 Unⅸ虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最优秀的系统。 Unix强大的根本原因: 简洁在Unix中所有的东西都被当做文件对待Unix的内核和相关的系统工具软件是用C语言编写的——正是这…