`
tcspecial
  • 浏览: 911469 次
  • 性别: 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  

 

 

分享到:
评论

相关推荐

    模拟内存分配 操作系统

    模拟内存分配是理解和研究这一过程的重要手段,它可以帮助我们理解实际操作系统中的内存管理策略。 内存分配的目标是为每个进程提供独立的、连续的内存空间,同时尽可能地提高内存利用率和系统性能。主要的内存分配...

    指针和内存分配详解

    内存分配是计算机程序中的一项基本操作,指针作为编程语言中的核心概念之一,与内存分配紧密相关。指针存储内存地址,通过它可以操作内存中的数据。了解指针和内存分配对于开发稳定和高效的软件至关重要。 首先,...

    C++动态内存分配研究

    ### C++动态内存分配研究 #### 一、内存分配方式 C++作为一种强大的面向对象编程语言,继承了C语言的基础并引入了许多高级特性。在C++中,内存管理是一项复杂而重要的任务,对于提高程序的稳定性和性能至关重要。...

    全面介绍Windows内存管理机制及C++内存分配.pdf

    《全面介绍Windows内存管理机制及C++内存分配》 在编程世界中,理解Windows内存管理机制和C++的内存分配方式至关重要。这篇文章旨在提供一个全面的概述,帮助开发者有效地使用这些工具,避免常见问题,如内存泄漏和...

    C++内存分配

    ### C++内存分配详解 #### 一、内存基础 ##### 1. 内存分配方式 C++程序中,内存的分配方式主要包括以下几种: - **静态存储区**:这部分内存在程序编译阶段就已经分配完成,并且在整个程序运行期间都保持不变。...

    嵌入式Web访问时的内存丢失问题

    一种可能的解决方案是采用非连续内存分配,允许分配不连续的内存块,或者调整BuddySystem以更好地适应实际应用需求。此外,优化CGI程序以减少内存使用,或者在内存紧张时限制并发CGI请求,也可能有助于缓解问题。 ...

    C语言的内存分配PPT课件.pptx

    本篇内容主要聚焦于堆区的内存分配和释放。 堆内存是程序运行时动态分配内存的地方,它的大小在程序编译时并不确定,而是根据程序运行时的需求来决定。动态存储分配是针对那些在运行时才能确定其大小或存在的变量或...

    内存出错的常见方式以及处理规避

    栈的特点在于内存分配速度快,但在空间上有一定限制。当函数执行完毕,栈中的数据会自动释放。 3. **静态区(static)**:用于存放全局变量和静态局部变量。这些变量在程序的整个生命周期内保持不变。 #### 四、...

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

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

    如何快速处理内存出错故障问题.docx

    1. **在DOS环境下运行应用程序时报内存出错**:首先检查是否存在内存分配错误,确认DOS与应用程序是否有冲突。可以通过重新启动系统或重新编写系统配置文件来解决,如果是应用程序本身的问题,则需对程序进行相应...

    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语言中的动态内存分配是程序运行时根据需要分配内存的一种机制,这与静态内存分配(如在声明变量或数组时分配)有所不同。动态内存分配允许程序员在程序运行过程中灵活地控制内存的使用,解决了编译期间无法确定...

    windows蓝屏代码详解

    9. **0x0009 - 储存体控制区块位址无效**:内存分配出错。 10. **0x0010 - 环境不正确**:程序运行的环境不满足其需求。 这些错误通常涉及到文件系统、内存管理、权限和程序执行等方面的问题。解决这些问题可能需要...

    Windows系统中内存出错的几个解决方案

    然而,如果内存分配失败,函数会返回0,这是一个错误信号。程序员应当在每次申请内存后检查返回值,确保分配成功。若未进行检查,程序可能会继续使用无效的0地址,这实际上指向的是系统至关重要的“中断描述符表”,...

    Windows内存出错的几个解决方案.docx

    在 Windows 操作系统中,应用程序需要一块内存用以储存数据时,就需要使用操作系统提供的「功能函数」来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用...

    内存出错怎么办?.docx

    这个文件是用来分配扩展内存的,但可能导致问题。禁用该文件,即在config.sys中屏蔽emm386.exe,通常能解决问题。 总结来说,处理内存出错的问题,首先要确保内存条与主板的兼容性和良好的物理连接。其次,检查内存...

    Windows内存出错的解决办法.docx

    内存分配失败可能由多种因素引起,如内存不足、系统函数版本不匹配等。 2. **应用程序BUG导致的无效内存引用**: 程序可能会因为自己的错误,比如忘记分配内存或意外释放了内存,而尝试访问不再有效的内存地址。...

    笔记,2、垃圾回收器和内存分配策略3

    《垃圾回收器与内存分配策略详解》 在Java编程中,理解垃圾回收(Garbage Collection,简称GC)机制和内存分配策略是至关重要的。GC的主要目的是自动管理内存,避免程序员手动进行繁琐且容易出错的内存释放工作。而...

Global site tag (gtag.js) - Google Analytics