静态变量

C++编程学习(八)【杂谈】new&delete动态内存分配

依然范特西╮ 提交于 2020-01-07 02:43:35
前段时间楼主忙着期末大作业,停更了一段,今天刚好在做机器人课程的大作业时,和同组的小伙伴利用python做了工业机器人的在线编程,突然想起来很久没有阅读大型工程了,马上补上~ 接下来的几篇博客主要是博主提炼了在阅读大型工程中遇到的一些不常见但是又必须理解的知识点。这一篇讲讲new和delete,进而延伸到内存分配的其他知识。 new & delete 这时候就不得不提到 动态分配内存 有很多时候实现定义好存储空间、数据规模、数组大小等,但是有时候不知道,有时候程序在运行过程中才知道数据有多大,这时候数组必须用动态分配的方法。(这也是为什么用指针,动态分配过程中没法使用变量名,这时候就会返回首地址,我们必须用地址访问存储空间了)。 那么什么是 首地址 ? 首地址就是该变量所占的存储区域中的第一个单元的地址。比如定义一个数组,数组的第一个数的地址就是首地址。 (1)申请一个对象 使用方法:NEW+类型名 释放内存操作符:delete,使用方法:delete+指针p(释放指针p所指向的内存),p必须是new操作的返回值。 例如: 1 int * p =new int(123); //p指向一个值,值是123 2 delete p; (2)分配和释放动态数组 分配:new +类型名+【数组长度】 释放:delete【】+数组名 注意:这里加了【】表示释放整个数组,如果不加【

设计模式之单例模式——只有一个实例

孤人 提交于 2020-01-04 00:20:15
目录 一 单例模式简介 1.1 定义 1.2 为什么要用单例模式呢? 1.3 为什么不使用全局变量确保一个类只有一个实例呢? 二 单例的模式的实现 2.1 饿汉方式(线程安全) 2.2 懒汉式(非线程安全和synchronized关键字线程安全版本 ) 2.3 懒汉式(双重检查加锁版本) 2.4 懒汉式(登记式/静态内部类方式) 2.5 饿汉式(枚举方式) 2.6 总结 一 单例模式简介 1.1 定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 1.2 为什么要用单例模式呢? 在我们的系统中,有一些对象其实我们只需要一个,比如说: 线程池、缓存、对话框、注册表、日志对象、充当打印机、显卡等设备驱动程序的对象。事实上,这一类对象只能有一个实例,如果制造出多个实例就可能会导致一些问题的产生,比如:程序的行为异常、资源使用过量、或者不一致性的结果。 简单来说使用单例模式可以带来下面几个好处: 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销; 由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。 1.3 为什么不使用全局变量确保一个类只有一个实例呢? 我们知道全局变量分为静态变量和实例变量,静态变量也可以保证该类的实例只存在一个。 只要程序加载了类的字节码

C#基础概念二十五问(一)

此生再无相见时 提交于 2020-01-01 00:54:05
1.静态成员和非静态成员的区别? 2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.什么是属性访问器? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? 15.接口可以包含哪些成员? 16.类和结构的区别? 17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何手工释放资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别? 23.explicit 和 implicit 的含义? 24.params 有什么用? 25.什么是反射? 以下是我做的一份参考答案(C# 语言范畴之内),如果有不准确、不全面的,欢迎各位朋友指正! 1.静态成员和非静态成员的区别? 答: 静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问 不带有 static

@autowired注入静态变量

浪子不回头ぞ 提交于 2019-12-30 15:14:48
@Autowired private static UserRepository userRepository; 当我们直接对静态变量进行注入的时候,会报: NullPointerException ; 解决方法: 为变量添加get set方法 private static UserRepository userRepository;  //get方法 public static UserRepository getUserRepository(){ return userRepository; }  //set方法 @Autowired public void setUserRepository(UserRepository userRepository){ ThreadParameterUtil.userRepository=userRepository; } 注意:   这里的set方法不是静态的,否则会出现和上边一样的问题,还是无法实例化对象;      UserRepository 类上一定要添加@Component注解或者类似注解,可以让Spring容器扫描到; 来源: https://www.cnblogs.com/wanghj-15/p/12119801.html

jvm虚拟机4.0笔记——类加载器的总结及拓展

不羁岁月 提交于 2019-12-29 19:31:10
类的加载 两种类加载器 : 1 Java虚拟机自带的加载器 根类加载器 扩展类加载器 系统(应用 )类加载器 2 用户自定义的类加载器 java.lang.ClassLoader的子类 定制类的加载方式 类加载器并不需要等到某个类被“首次主动使用”时再加载它 JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误) 类的验证 类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。 类的验证内容(不止这些) 类文件的结构检查 语义检查 字节码验证 二进制兼容性的验证 类的准备 在准备阶段,Java虚拟机为类的静态变量分配内存,并设置默认的初始值。例如对于以下Sample类,在准备阶段,将为int类型的静态变量a分配4个字节的内存空间,并且赋予默认值0,为long类型的静态变量b分配8个字节的内存空间,并且赋予默认值0。 类的初始化 在初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。 在程序中,静态变量的初始化有两种途径: (1)在静态变量的声明处进行初始化; (2)在静态代码块中进行初始化。 类的初始化步骤 假如这个类还没有被加载和连接,那就先进行加载和连接 假如类存在直接父类

堆和栈的区别

狂风中的少年 提交于 2019-12-28 21:02:49
一、预备知识 :程序的 内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由 编译器 自动分配释放 ,存放 函数 的参数值, 局部变量 的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。 注意它与数据结构中的堆是两回事 ,分配方式倒是类似于 链表 。 3、全局区(静态区)(static)— 全局变量和 静态变量 的存储是放在一块的,初始化的 全局变量 和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。 4、文字常量区 — 常量字符串就是放在这里的,程序结束后由系统释放 。 5、程序代码区 — 存放函数体的二进制代码。 二、例子程序 int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; // 栈,系统自动在栈中为b开辟空间 char s[] = "abc"; //栈 char *p2; // 栈 char *p3 = "123456"; //123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = new char[20]; p2 = (char *)malloc(20); }

堆和栈的区别

懵懂的女人 提交于 2019-12-28 21:02:28
堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc";栈 char *p2; 栈 char *p3 = "123456";123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。

代码区、常量区、静态区(全局区)、堆区、栈区?

梦想的初衷 提交于 2019-12-28 21:01:16
一般内存主要分为:代码区、常量区、静态区(全局区)、堆区、栈区这几个区域 代码区:存放程序的二进制代码,即CPU执行的机器指令,并且是只读的。 常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等) 全局区 或 静态区:静态变量和全局变量的存储区域是一起的, 初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域. 一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放. 堆区:由程序员动态内存分配,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏.( 注意它与数据结构中的堆是两回事 ) 栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。 代码例子 int a = 0; //全局初始化区char * p1; //全局未初始化区int main(){ int b; //栈 char s[] = "abc"; //栈 char * p2; //栈 char p3 = "123456"; // 123456/0在常量区

静态变量的特点

此生再无相见时 提交于 2019-12-27 18:54:18
静态变量的特点 code Result code // c1.cpp : Defines the entry point for the console application. // # include "stdafx.h" # include <iostream> using namespace std ; class A { public : void Fun ( ) { static int i_s ( 0 ) ; i_s ++ ; cout << i_s << endl ; } } ; int _tmain ( int argc , _TCHAR * argv [ ] ) { A a ; a . Fun ( ) ; A b ; b . Fun ( ) ; A c ; c . Fun ( ) ; system ( "pause" ) ; return 0 ; } Result 静态变量的可以定义在类内,可以定义在函数内,是类共有的。只初始化一次。生命周期是整个程序。 来源: CSDN 作者: 墨风格 链接: https://blog.csdn.net/Zhubingge/article/details/103736145

C/C++内存四区

烂漫一生 提交于 2019-12-27 02:15:27
内存模型图 32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中0~3G是用户态空间,3~4G是内核空间,不同进程相同的逻辑地址会映射到不同的物理地址中。其逻辑地址其划分如下: 各个段说明如下: 3G用户空间和1G内核空间 静态区域: text segment( 代码段 ):包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码。 data segment( 数据段 ):存储程序中已初始化的全局变量和静态变量 bss segment( BSS段 ):存储未初始化的全局变量和静态变量(局部+全局),以及所有被初始化为0的全局变量和静态变量,对于未初始化的全局变量和静态变量,程序运行main之前时会统一清零。即未初始化的全局变量编译器会初始化为0 动态区域: heap( 堆区 ): 当进程未调用malloc时是没有堆段的,只有调用malloc时采用分配一个堆,并且在程序运行过程中可以动态增加堆大小(移动break指针),从低地址向高地址增长。分配小内存时使用该区域。 堆的起始地址由mm_struct 结构体中的start_brk标识,结束地址由brk标识。 memory mapping segment( 映射区 ):存储动态链接库等文件映射、申请大内存(malloc时调用mmap函数) stack( 栈区 ):使用栈空间存储函数的返回地址