`
tcspecial
  • 浏览: 896299 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

内存分配出错

阅读更多

    最近遇到一个非常有意思的bug,程序总是在 list.push_back() 这行崩溃。代码如下:

    

// 初始化线程池	
void init_threads( int m_thread_number )
{	
	thread_t *m_threads;
	
	m_threads = new pthread_t(m_thread_number); 
	assert( m_threads != NULL );

	int ret = 0;
	
	// 创建指定数量线程
	for(int i=0;i<m_thread_number;i++)
	{
		ret = pthread_create( m_threads+i,NULL,worker,this );
		assert( ret == 0 );
	
		ret = pthread_detach(m_threads[i]);
		assert( ret == 0 );
	}
	
	// 测试一
	std::list<double> list;
	list.push_back(40.8);
	
	// 测试二
	// new int(5); 
}

   

    将push_back()这行代码注释,更换成测试二代码一样会出错。出错堆栈均定位到malloc(),如更换成不分配内存的代码,运行很正常。 看到此,百思不得其解。此时内存是完全足够的,不存在无法分配内存的情况。只有一种可能,程序堆栈被早已损坏。现代OS的容错能力比较强,真正bug处没有立即出错,可能运行在另一台电脑上,会立即出错。

    且看 pthread_create( m_thread+i,NULL,worker,this )  这行代码,说明参数一m_threads是大小为m_thread_number的数组,再看数组初始化:m_threads = new pthread_t(m_thread_number); 额,这分明是在堆上分配了一个整形变量,初始值为m_thread_number,m_thread+i 已经在访问未分配的内存区了,此处应该会崩溃的,但很幸运的过去了。原来手误将[]写成了(),更改成 new pthread_t[m_thread_number],运行OK  

 

 

分享到:
评论

相关推荐

    易语言防止程序退出内存错误

    易语言防止程序退出内存错误源码,防止程序退出内存错误,干进程,取得ID,强力打开进程,取字节集指针,取进程ID,ShowWindow,ZwQueryInformationProcess,ZwDuplicateObject,ZwQuerySystemInformation,ZwOpenProcess,...

    STM32103单片机读写OV2640 摄像头驱动测试程序工程源码.zip

    ov2640_framebuf) //内存分配出错 { Show_Str(30,150,240,16,"内存分配失败!",16,0); delay_ms(200); LCD_Fill(30,150,240,146,WHITE);//清除显示 delay_ms(200); } while...

    内存管理内存管理内存管理

    程序的动态性越强,内存管理就越重要,您的内存分配程序的选择也就更重要。让我们来了解可用于内存管理的不同方法,它们的好处与不足,以及它们最适用的情形。 C 风格的内存分配程序 C 编程语言提供了两个函数来...

    游戏画面就弹出内存不能为read修复工具

    先说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在缓冲区,需要操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用...

    操作系统(内存管理)

    因此,当加载一个进程时,它会得到一个取决于某个称为 系统中断点(system break)的特定地址的初始内存分配。该地址之后是未被映射的内存 —— 用于在 RAM 或者硬盘中没有分配相应物理位置的内存。因此,如果一个...

    内存泄漏和防范

    动态分配、回收内存是 C /C + +编程语言一个最强的特点 ,但是最强的同时也可能是最弱的 ,在内存处理出错的地方通常就是 BUGS 产生的地方。一个最敏感和难检测的 BUGS 就是内存泄漏 — 没有把前边分配的内存成功释放 ...

    0x00000000内存不能为read修复工具

    程序需要一块内存用以保存数据时,就需要调用操作系统提供的“功能函数”来申请,如果内存分配成 功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这 就是“动态内存...

    e语言-内存运行易语言模块

    资源介绍:源码演示了内存运行软件,可用于给别人的成品软件加群验证,网络验证然后上市。资源作者:易语言源码资源界面:资源下载:

    内存问题引起的常见故障

    4:Windows系统中运行DOS状态下的应用软件时,由于内存空间分配冲突,导致电脑出现黑屏、花屏、死机现象。 5:Windows运行速度明显变慢,系统出现许多有关内存出错的提示。 电脑运行的应用程序有时候会非法访问...

    :counterclockwise_arrows_button:灵活的C内存分配方案-C/C++开发

    具有与malloc,realloc和free相同的API,从而释放了代码从必须到c的mulle-allocator:counterclockwise_arrows_button:灵活的C内存分配方案...提供了一种遍历内存方案的方法...具有与malloc,realloc,free相同的API ...

    Windows Server 2012 R2 Hyper-V虚拟化常见异常处理方法总结

    我尝试调整动态内存分配但未能够此解决,后来将动态内存分配功能关闭使用正常使用正常!以前部署的时候不会有这种情况,估计与服务器硬件有关系(此服务器硬件使用DELL R720),具体原因未知; 问题二:虚拟机设备...

    基于C++中常见内存错误的总结

    少量的内存泄露不至于让程序崩溃,但是大量的内存泄露就会导致内存耗尽,后续内存分配失败,从而导致程序崩溃。长时间运行软件,即使只有一两处泄露,同样会导致程序崩溃。所以有当出现内存泄露请检查是否释放了资源...

    OS实验报告(实验二).doc

    在进行内存分配时,系统优先使用空闲区" " "低端的空间。 " " "假设初始状态下可用的内存空间为640KB,并有下列的请求序 " " "列: " " "*作业1申请130KB " " "*作业2申请60KB " " "*作业3申请100KB " " "*作业2释放...

    C语言中的指针和内存泄漏

    引言 ...  在使用动态内存分配时必须考虑的检查点  导致内存泄漏的场景  如果您预先知道什么地方可能出错,那么您能够小心避免陷阱,并消除大多数与指针和内存相关的问题。  什么地方可能出错

    nachos 3.4线程+文件系统+虚拟内存实习代码和报告

    nachos版本:3.4 运行环境: ubuntu 32bit(64位会出错) 主要包括:多线程调度、切换,用户态程序运行,虚拟内存管理分配,文件系统管理

    代码编辑器的可编译的全部代码【空间也有视频讲解】

    1,内存管理 用到在分配内存,不负责回收内存,具体就分配一块内存禁止读写,设置读写异常程序,当那块内存被读写时会进入异常程序在里面分配内存再继续运行。 2,操作管理 包括操作撤销和操作恢复。主要是以行为...

    怎么有效的防止内存泄漏

    上面代码粗略看似没有问题,但是有没有想到如果People构造函数出错(内存不足,无法分配内存)怎么办?其结果可以预见,就是一个异常抛出来。但是我们仔细想想此时如果已经构造了Image类对象,而在构造Voice类对象时抛...

    补丁模块(带源码)InlinePatch,Hook,内存DLL注入等等

    子程序 读内存字节集, 字节集, 公开, 从内存中读取字节集数据(返回字节集,失败返回0字节长度的空字节集) .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 长度, 整数型, , 欲读取内存数据的...

    北科大操作系统大作业的

    内存管理:内存管理负责分配和回收内存,以及处理内存碎片。它还负责虚拟内存和物理内存之间的映射。在设计操作系统时,需要考虑的非功能需求包括内存利用率(即系统能否有效地利用内存)、性能(即系统在处理内存...

    PandaOCR_2.65.zip

    PandaOCR_2.65.zip 文字设别

Global site tag (gtag.js) - Google Analytics