堆栈

C++栈和堆的生长方向

橙三吉。 提交于 2020-03-27 21:29:15
C++内存区域 分为5个区域。分别是堆,栈,自由存储区,全局/静态存储区和常量存储区。 栈 :由编译器在需要的时候分配,在不需要的时候自动清除的变量存储区。里面通常是局部变量,函数参数等。 堆 :由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new对应一个delete。如果程序员没有释放掉,那么在程序结束后, 操作系统 会自动回收。 自由存储区 :由malloc等分配的内存块,和堆十分相似,不过它使用free来结束自己的生命。 全局/静态存储区 :全局变量和静态变量被分配到同一块内存中,在以前的c语言中。全局变量又分为初始化的和未初始化的,在c++里面没有这个区分了,他们共同占用同一块内存。 常量存储区 :这是一块比较特殊的存储区,里面存放的是常量,不允许修改。 C++内存区域中堆和栈的区别 : 管理方式不同 :栈是由编译器自动管理,无需我们手工控制;对于堆来说,释放由程序员完成,容易产生内存泄漏。 空间大小不同 :一般来讲,在32为系统下面,堆内存可达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定空间大小的,例如,在vc6下面,默认的栈大小好像是1M。当然,也可以自己修改:打开工程。 project-->setting-->link,在category中选中output

Java 打印堆栈的几种方法 Exception

偶尔善良 提交于 2020-03-27 21:07:56
Exception e = new Exception("this is a log"); e.printStackTrace(); //延迟才可以看出效果 Thread.currentThread().sleep(1000); System.out.println("-------------以上是异常详细信息----------------"); System.out.println("打印异常1:"+e.toString()); String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e); System.out.println("打印异常2:"+fullStackTrace); package name.xu; public class CallStack { public static void printCallStatck() { Throwable ex = new Throwable(); StackTraceElement[] stackElements = ex.getStackTrace(); if (stackElements != null) { for (int i = 0; i < stackElements.length;

Lua调用C++时打印堆栈信息

↘锁芯ラ 提交于 2020-03-27 21:06:36
公司的手游项目,使用的是基于cocos2d-x绑lua的解决方案(参数quick-x的绑定),虽然使用了lua进行开发,更新很爽了,但是崩溃依然较为严重,从后台查看崩溃日志时,基本上只能靠“猜”来复现bug。更为郁闷的是很多时候并没有使用log输出,在崩溃日志里还无法查看大概在哪一步操作崩溃的… 后来在网上搜索了一下,受到一点启发,lua代码在执行的时候可随时调用debug.traceback()方法来获得调用栈的字符串信息,如下图所示: 而c++导出方法给lua调用,是使用tolua++工具实现的,通过ant实现将多个pkg文件生成一个cpp文件。所以只能在ant的build.xml配置中想办法了,好在ant本身就支持正则的任务“ReplaceRegExp”,在调用的方法前面添加打印堆栈的方法即可。 打印lua调用堆栈的方法: // 打印lua调用栈开始 lua_getglobal(tolua_S, "debug"); lua_getfield(tolua_S, -1, "traceback"); int iError = lua_pcall( tolua_S,//VMachine 0,//Argument Count 1,//Return Value Count 0); const char* sz = lua_tostring(tolua_S, -1); CCLog(sz);

2019年 7月13 复习一个星期所学的

折月煮酒 提交于 2020-03-27 08:42:39
1.所有数组的下表都是从0开始 2.ArrayList 动态数组 在里边添加元素 用Add方法 3.object是引用类型 4.与队列对应的堆栈是stack 5.队列先进先出 6.堆栈后进先出 7.类没有返回值 8.五大约束 基类名 值约束 引用约束 new约束 接口约束 9.枚举默认从0开始 10.匿名类型就是没有名字的类型 来源: https://www.cnblogs.com/hanzhuopeng/p/11179501.html

进入保护模式

与世无争的帅哥 提交于 2020-03-26 15:04:05
全局描述符   和一个段有关的信息需要 8 个字节来描述,所以称为 段描述符(Segment Descriptor) ,每个段都需要一个描述符。为了存放这些描述符,需要在内存中开辟出一段空间。在这段空间里,所有的描述符都是挨在一起,集中存放的,这就构成一个 描述符表 ,最主要的描述符表是 全局描述符表(Global Descriptor Table,GDT) 。   为了跟踪全局描述符表,处理器内部有一个 48 位的寄存器,称为 全局描述符表寄存器(GDTR) 。该寄存器分为两部分,分别是 32 位的线性地址和 16 位的边界。32 位的处理器具有 32 根地址线,可以访问的地址范围是 0x00000000 到0xFFFFFFFF,共 232字节的内存,即 4GB 内存。所以,GDTR的 32 位线性基地址部分保存的是全局描述符表在内存中的起始线性地址,16 位边界部分保存的是全局描述符表的边界(界限),其在数值上等于表的大小(总字节数)减一。   因为 GDT 的界限是 16 位的,所以,该表最大是 2 16 字节,也就是 65536 字节(64KB)。又因为一个描述符占 8 字节,故最多可以定义 8192 个描述符。   由于在实模式下只能访问 1MB 的内存,故 GDT 通常都定义在 1MB 以下的内存范围中。当然,允许在进入保护模式之后换个位置重新定义 GDT。

Java 14 发布了,再也不怕 NullPointerException 了!

…衆ロ難τιáo~ 提交于 2020-03-26 11:02:07
2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载。在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 358: Helpful NullPointerExceptions null何错之有? 对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NullPointerException)的骚扰。相信很多程序员都特别害怕出现程序中出现NPE,因为这种异常往往伴随着代码的非预期运行。 在编程语言中,空引用(Null Reference)是一个与空指针类似的概念,是一个已宣告但其并未引用到一个有效对象的变量。 在Java 1 中就包含了了Null引用和NPE了,但是其实,Null引用是伟大的计算机科学家Tony Hoare 早在1965年发明的,最初作为编程语言ALGOL W的一部分。 1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法。ALGOL W是第一批在堆上分配记录的类型语言之一。Hoare选择null引用这种方式,“只是因为这种方法实现起来非常容易”。虽然他的设计初衷就是要“通过编译器的自动检测机制,确保所有使用引用的地方都是绝对安全的”,他还是决定为null引用开个绿灯,因为他认为这是为“不存在的值”建模最容易的方式。 但是在2009年,很多年后

堆栈小应用:配对

走远了吗. 提交于 2020-03-24 20:55:54
在“配对”问题中,栈将使问题大大简化和更富逻辑性。一个简单的例子,我们来看看如何判断表达式中的小括号是否配对。如果没有栈,这问题就不会那么美妙了。 只要你脑袋里能联想到“栈”这个词,解决方案就会变得非常简单。 遍历表达式,遇到左括号则进栈,遇到有括号则将栈顶左括号弹出,遍历完后,栈应该为空。如果不能顺利执行此过程那么表达式的括号则一定不匹配。 #include < iostream > #include < string > #include < stack > using namespace std; int main() { stack < char > stk; string exp; bool ok = true ; cin >> exp; const int len = exp.length(); for ( int i = 0 ; i < len; i ++ ) { if (exp[i] == ' ( ' ) { stk.push(exp[i]); } else if (exp[i] == ' ) ' ) { if ( ! stk.empty()) { stk.pop(); } else { cout << " not find \'(\' for \')\' at index of " << i << endl; ok = false ; } } } if ( !

C# 全局异常捕获(转载)

独自空忆成欢 提交于 2020-03-24 12:39:59
C# 全局异常捕获 原文地址: https://www.cnblogs.com/tomahawk/articles/5993874.html 开发界有那么一个笑话,说是“「我爱你」三个字,讲出来只要三秒钟,解释要三小时,证明却要一辈子。「Bug」三个字母,发现需要三秒,找到需要三小时,Debug却要一辈子。”。就算是资深的程序员也会写出Bug,但Bug并不可怕,重要的是在Bug发生的时候迅速定位Bug。 在Visual Studio中调试的时候,我们可以借助VS的调试工具进行调试,一旦出现未处理的异常时,VS也会在第一时间捕获并显示出来。随着开发的进行,终于程序要打包上线了。那么在上线之出了BUG我们该如何处理呢? 相信如果各位年龄够大,应该都见识过QQ出错崩溃吧?在零几年的时候QQ崩溃还不是一件稀罕事儿。每当QQ崩溃的时候都会弹出一个BUGReporter程序,会希望我们将出错的报告发送给腾讯 其实我们标题所说的全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃。因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG。一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈。 一、简单粗暴:在Program.cs使用Try...Catch... 大家都知道,异常是通过Throw命令抛出,一路从抛出的模块里上抛,如果中途没有被try...catch.

每个程序员都必须掌握的 8 种数据结构!

不想你离开。 提交于 2020-03-24 12:27:28
作者:IT-Evan https://www.cnblogs.com/IT-Evan/p/12444968.html 数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。 几乎所有已开发的程序或软件系统都使用数据结构。此外,数据结构属于计算机科学和软件工程的基础。当涉及软件工程面试问题时,这是一个关键主题。因此,作为开发人员,我们必须对数据结构有充分的了解。 在本文中,我将简要解释每个程序员必须知道的8种常用数据结构。 1.数组 数组是固定大小的结构,可以容纳相同数据类型的项目。它可以是整数数组,浮点数数组,字符串数组或什至是数组数组(例如二维数组)。数组已建立索引,这意味着可以进行随机访问。 Fig 1. Visualization of basic Terminology of Arrays 数组运算 · 遍历:遍历所有元素并进行打印。 · 插入:将一个或多个元素插入数组。 · 删除:从数组中删除元素 · 搜索:在数组中搜索元素。您可以按元素的值或索引搜索元素 · 更新:在给定索引处更新现有元素的值 数组的应用 · 用作构建其他数据结构的基础,例如数组列表,堆,哈希表,向量和矩阵。 · 用于不同的排序算法,例如插入排序,快速排序,冒泡排序和合并排序。 2.链表 链表是一种顺序结构

JVM源码分析之javaagent原理完全解读

帅比萌擦擦* 提交于 2020-03-24 12:22:05
问题描述 当我们一个系统既需要mysql驱动,也需要oracle驱动的时候,在并发加载初始化这些驱动类的过程中产生死锁的可能性非常大,下面是一个模拟的例子,对于Thread2的实现其实是jdk里java.sql.DriverService的逻辑,也是我们第一次调用java.sql.DriverManager.registerDriver注册一个驱动实例要走的逻辑(jdk1.6下),不过这篇文章是使用我们生产环境的一个系统的线程dump和内存dump为基础进行分析展开的。 如果以上代码运行过程中发现有线程一直卡死在Class.forName的调用里,那么说明问题已经重现了。 先上两张图 内存态线程堆栈 线程堆栈 存疑点 仔细看看上面的线程dump分析和内存dump分析里的线程分析模块,您可能会有如下两个疑惑: 【为什么线程[Thread-0]一直卡在Class.forName的位置】:这有点出乎意料,做一个类加载要么找不到抛出ClassNotFoundException,要么找到直接返回,为什么会一直卡在这个位置呢? 【明明[Thread-0]注册的是mysql驱动为什么会去加载Odbc的驱动类】:通过[Thread-0]在栈上看倒数第二帧展开看到传入Class.forName的参数是com.mysql.jdbc.Driver,然后展开栈上顺序第二帧,看到传入的参数是sun.jdbc