C/C++进阶(一)--内存管理
更多精彩内容.....
🎉❤️播主の主页✨😘
Stark、-CSDN博客
本文所在专栏:
学习专栏C语言_Stark、的博客-CSDN博客
其它专栏:
数据结构与算法_Stark、的博客-CSDN博客
项目实战C系列_Stark、的博客-CSDN博客
座右铭:梦想是一盏明灯,照亮我们前行的路,无论风雨多大,我们都要坚持不懈。
在前面,我们学习C语言的时候,我们就提到过内存的概念,介绍了内存的分区以及各个区域负责的事情,并且给出了一些内存函数使用。
C语言的内存知识_c语言内存-CSDN博客
本节我们主要是学习内存的管理。
一、内存分区模型
一般我们将内存划为四个或五个区,而真实的内存远远不止这四五个区。我们先来回顾一下内存分区的知识:
Ⅰ.栈区(stack):由编译器自动分配释放。存放函数的参数值,局部变量的值等。
Ⅱ.堆区(heap):一般由程序员分配释放(动态内存申请和释放)。若程序员不释放,程序结束时可能由操作系统回收。
Ⅲ.全局区(global)/静态区(static):全局变量和静态变量是放在一块的,初始化的全局变量和静态变量在一块儿区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块儿区域,该区域在程序结束后由操作系统释放。
Ⅳ.常量区(const):字符串常量和其它常量的存储位置,程序结束后操作系统回收
Ⅴ.程序代码区(code):存放函数体的二进制代码
下面我们给出一段代码进行一下简单的验证:
int g_a;//全局变量
int g_b;
static int s_g_a;//静态全局变量
static int s_g_b;
const int c_g_a=1;//全局常量
const int c_g_b=1;
const static int c_s_g_a;//静态全局常量
const static int c_s_g_b;
int main() {cout << "全局变量" << endl;cout << &g_a << endl;cout << &g_b << endl;cout << "静态全局变量" << endl;cout << &s_g_a << endl;cout << &s_g_b << endl;cout << "全局常量" << endl;cout << &c_g_a << endl;cout << &c_g_b << endl;cout << "静态全局常量" << endl;cout << &c_s_g_a << endl;cout << &c_s_g_b << endl;int l_a;//局部变量int l_b;cout << "局部变量" << endl;cout << &l_a << endl;cout << &l_b << endl;const int c_l_a=1;//局部常量const int c_l_b=1;cout << "局部常量" << endl;cout << &c_l_a << endl;cout << &c_l_b << endl;static int s_l_a;//静态局部变量static int s_l_b;cout << "静态局部变量" << endl;cout << &s_l_a << endl;cout << &s_l_b << endl;const static int c_s_l_a;//静态局部常量const static int c_s_l_b;cout << "静态局部常量" << endl;cout << &c_s_l_a << endl;cout << &c_s_l_b << endl;//字面量(字符串常量)cout << "字面量地址:" << &("123") << endl;return 0;
}
从中,我们不难发现,本次运行时,全局区的数据全部在00007FF69DC5开头的内存地址处,并且静态区的也是放在了这段内存中,而且:变量在+F1+段,常量在+BB+段。另外不被const修饰的普通常量(字符串字面量)的地址也存在了00007FF69DC5这段内存中,且在+C010处。综上分析,我们可以知道: 大致就是这么一个分布。
Linux系统由操作系统预留空间,一般默认8M,Windows系统由编译器预留空间,其中VC++一般默认1M。当我们使用栈区空间时,都是比较节俭的,所以我们程序员一般会主动向堆区申请空间,以免栈溢出。
如果把内存分为四个区的话,一般不包括常量区。而其它四区的建立流程是:
流程说明:操作系统把物理硬盘代码load到内存=>操作系统把c代码分成四个区=>操作系统找到main函数入口执行。
二、函数调用模型
C语言的函数-CSDN博客
在上面将函数的时候我们提过函数栈帧的概念。那么这就是函数调用的模型。学好之后对函数的递归学习有很大帮助哦。
1、 一个主程序有n个函数组成,C++编译器会建立有几个堆区?有几个堆区?
2、函数嵌套调用时,实参地址传给形参后,C++编译器如何管理变量的生命周期?
分析:通过函数fa(),调用函数fb(),通过参数传递的变量,内存空间能用嘛?
三、内存管理
在前文的内存知识章节我们只说了内存函数,没有说内存管理函数。对于C语言,内存管理函数包括:malloc,realloc,calloc,以及free四个。包含在头文件<stdlib.h>中。
1.malloc()函数
用处:申请堆区空间
函数原型:void* malloc(size_t _Size)
函数解析:参数是需要申请的空间字节大小,返回值是void*类型的指针,方便类型转换为其他类型的指针。
使用例子:
int *p=(int*)malloc(sizeof(int)*5);//申请能存放五个int类型数据的空间
//相当于一个存在于堆区的数组int [5],但不是。
2.realloc()函数
用处:申请的空间不足,需要扩容
函数原型:void* realloc(void *_Block,size_t _Size)
函数解析:void*的用处全都是方便类型转换,_Size是字节大小。_Block是需要扩容的指针
使用例子:
int * p=(int*)malloc(sizeof(int)*4);
for(int i=0;i<4;i++){p[i]=i;
}
//此时我想对p[4]进行赋值,明显已经越界了,那我就扩容
p = (int*)realloc(p,sizeof(int)*8);
p[4]=15;
3.calloc()函数
用处:开辟空间的同时,赋予一定数量的内存一个初始默认值
函数原型:void* calloc(size_t _Count,size_t _Size)
函数解析:类似于malloc,不过参数多了一个_Count,这个参数的意思是,在申请空间的同时,为前Count块内存赋予初始默认值。
使用例子:
int n;cin>>n;//准备开辟多少 个 空间。
int *p=(int*)calloc(n,sizeof(int)*n);//个数*每个所占字节=总字节
for(int i=0;i<n;i++){cout<<p[i]<<" ";
}
4.free()函数
用处:释放申请的堆区空间
函数原型:void free(void* _Block)
函数解释:将_Block指向的堆区空间进行释放。
使用例子:
free(p);//p为上面申请的指针的任意一个
初识new与delete
C++中的new运算符和delete运算符用于在堆上动态分配和释放内存。堆上的内存由程序员手动管理,可以在程序的任意位置进行分配和释放。
new运算符的语法如下:
new type;
new type[size];
其中,type可以是任意的数据类型,size是一个整数,表示要分配的数组大小。
new运算符会在堆上分配一块内存,并返回一个指向该内存的指针。如果分配成功,new运算符将返回一个指向type的指针;如果分配失败,new运算符将抛出std::bad_alloc异常。
例如,下面的代码分配了一个int数组:
int* arr = new int[10];
delete运算符的语法如下:
delete ptr;
delete[] ptr;
其中,ptr是由new运算符返回的指针。
delete运算符会释放ptr指向的内存,并调用析构函数来销毁对象(如果有的话)。如果ptr为nullptr,则delete运算符不会进行任何操作。
如果ptr是由new[]运算符返回的指针,则必须使用delete[]运算符来释放内存。如果使用delete运算符来释放由new[]分配的内存,行为是未定义的。
例如,下面的代码释放了前面分配的int数组:
delete[] arr;
需要注意的是,使用new运算符分配的内存必须使用delete运算符来释放,否则就会出现内存泄漏。同样地,使用new[]运算符分配的数组必须使用delete[]运算符来释放。
另外,还可以使用placement new运算符在已经分配的内存上构造对象,以及使用delete运算符销毁对象并释放内存。但这种用法相对较少见,一般只在特定场景下使用。
下面是一个完整的示例,展示了如何使用new与delete
运算符:
#include <iostream>
class MyClass {
public: MyClass(int val) : value(val) { std::cout << "Constructor called: " << value << std::endl; }~MyClass() {std::cout << "Destructor called: " << value << std::endl; }
private: int value;
};
int main() { // 动态分配单个对象 MyClass* obj = new MyClass(10); // 动态分配数组 MyClass* arr = new MyClass[3] { MyClass(1), MyClass(2), MyClass(3) }; // 释放单个对象 delete obj; // 释放数组 delete[] arr; return 0;
}
在这个示例中,我们定义了一个简单的类MyClass
,并展示了如何使用new
运算符分配内存和delete运算符释放内存。
剖析new与delete
(本段内容为转载:深入理解C++ new/delete, new []/delete[]动态内存管理 - tp_16b - 博客园)
在C语言中,我们写程序时,总是会有动态开辟内存的需求,每到这个时候我们就会想到用malloc/free 去从堆里面动态申请出来一段内存给我们用。但对这一块申请出来的内存,往往还需要我们对它进行稍许的“加工”后即初始化 才能为我们所用,虽然C语言为我们提供了calloc来开辟一段初始化好(0)的一段内存,但面对象中各是各样的数据成员初始化,它同样束手无策。同时,为了保持良好的编程习惯,我们也都应该对申请出来的内存作手动进行初始化。
对此,这常常让我们感到一丝繁琐,于是到了C++中就有了new/delete, new []/delete[] 。用它们便可实现动态的内存管理。
在C++中,把int 、char..等内置类型的变量也看作对象,它们也是存在构造函数和析构函数的,只是通常对它们,系统调用了默认的构造函数来初始化以及默认的析构(编译器优化)。所以new int、new int(3)看起来和普通的定义好像没什么区别。 但对于自定义类型的对象,此种方式在创建对象的同时,还会将对象初始化好;于是new/delete、new []/delete []方式管理内存相对于malloc/free的方式管理的优势就体现出来了,因为它们能保证对象一被创建出来便被初始化,出了作用域便被自动清理。
* malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员)。
* 它们都是动态管理内存的入口。
* malloc/free是C/C++标准库的函数,new/delete是C++操作符。
* malloc/free需要手动计算类型大小且返回值w为void*,new/delete可自动计算类型的大小,返回对应类型的指针。* malloc/free管理内存失败会返回0,new/delete等的方式管理内存失败会抛出异常。
四、常见内存错误
1.内存泄露
概念:内存泄漏(Memory Leak)是指程序在运行过程中,未能释放已经分配的内存空间,从而导致可用内存减少的现象。随着时间的推移,内存泄漏会导致系统性能下降,甚至可能导致程序崩溃。
内存泄漏一般发生在以下情况下:
-
动态分配内存但未释放:使用如
malloc/new
(在C/C++中)申请内存后,如果没有相应的free/delete
调用便不会释放这块内存。 -
引用计数错误:在使用引用计数管理内存的情况下,如果对象之间形成循环引用,可能导致对象的内存无法释放。
-
不适当地存储指针:程序在某个数据结构中存储了对动态分配内存的指针,但在不再需要该数据结构时,没有释放内存。
为防止内存泄漏,开发者可以采取以下措施:
- 使用智能指针(在C++中,可自动管理内存)。
- 定期检查和分析代码,寻找潜在的内存泄漏。
- 使用内存检测工具(如Valgrind等),识别和报告内存泄漏问题。
- 确保在不再需要对象时适时释放内存。
总结:申请的内存空间没有被释放掉。及时发现和修复内存泄漏问题,可以提高程序的稳定性和性能。
2.栈溢出
概念:栈溢出(Stack Overflow)是一种运行时错误,发生在程序使用的栈空间超过了栈所分配的大小时。栈是用于存储局部变量和函数调用信息的一块内存区域,每当一个函数被调用时,相关的局部变量和返回地址等信息会被压入栈中;当函数执行完毕时,这些信息会被弹出栈外。
栈溢出的常见原因包括:
-
深度递归:当一个函数递归调用自身且没有适当的终止条件时,可能导致栈帧不断增加,最终消耗完分配给栈的内存。
-
过大的局部变量:在函数中声明过大的数组或数据结构,也可能导致栈空间不够。
-
无限循环或错误的循环逻辑:在某些情况下,如果循环体中的函数调用未能适当退出,也可能引发栈溢出。
栈溢出会导致程序崩溃,通常会触发操作系统的保护机制,从而抛出异常或错误信息。为防止栈溢出,可以采取以下措施:
-
避免不必要的深度递归:使用迭代法替代递归,或者优化递归算法以减少栈深度。
-
合理使用局部变量:尽量避免在栈上使用过大的数据结构,考虑使用堆分配(如动态分配内存)。
-
监测和调试用:使用调试工具跟踪栈的使用情况,识别潜在的栈溢出风险。
-
控制递归深度:合理设计递归的深度和适当的退出条件。
总结:存在栈区的数组开辟太大,递归层次太深。有效减少栈溢出的发生,确保程序的稳定性和可靠性。
3.越界访问与野指针
越界访问:在数组或存储块的边界之外进行读或写操作。可能导致数据损坏或安全漏洞。
野指针:访问未初始化的指针会导致不可预测的行为,因为它指向未知的内存区域。
4.双重释放与悬挂指针
悬挂指针:指向已经释放的内存地址的指针。使用这种指针进行访问会导致未定义行为。悬挂指针通常是在调用delete
或free
后未将指针置为nullptr
导致的。
双重释放:指同一块内存被delete
或free
多次释放,这会导致未定义行为,甚至程序崩溃。
5.其他情况
其它情况还包括:使用new而不配对delete,使用malloc而不配对free,或者使用new开辟多块空间没有使用delete[]。
不当使用智能指针:虽然智能指针(如std::unique_ptr
和std::shared_ptr
)可以帮助管理内存,但不正确的使用仍然可能导致悬挂指针、循环引用(在std::shared_ptr
中)等问题。
感谢大家。
相关文章:
C/C++进阶(一)--内存管理
更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 本文所在专栏: 学习专栏C语言_Stark、的博客-CSDN博客 其它专栏: 数据结构与算法_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 座右铭&a…...
docker-compose 快速部署clickhouse集群
在本教程中,我们将学习如何使用 Docker Compose 部署一个带有三节点的 ClickHouse 集群,并使用 ZooKeeper 作为分布式协调服务。 前提条件 注意事项: 镜像版本号注意保持一致 [zookeeper:3.7, clickhouse/clickhouse-server:22.5.4]config…...
闯关训练三:Git 基础知识
任务1: 破冰活动:自我介绍 点击Fork目标项目,创建一个新的Fork 获取仓库链接 在连接好开发机的vscode终端中逐行执行以下代码: git clone https://github.com/KelvinIII/Tutorial.git # 修改为自己frok的仓库 cd Tutorial/ git branch -a g…...
Java--IO基本流
IO流 概述 生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了ctrls ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘…...
结合大语言模型的机械臂抓取操作简单介绍
一、大语言模型与机械臂抓取的基本操作 1. 大语言模型简介 大语言模型是基于深度学习技术构建的自然语言处理模型,能够生成、理解和处理文本信息。这些模型通过训练大量的文本数据,学习语法、上下文和常识,能够执行多种任务,如文…...
Vivado - BD(差分时钟、简单分频、RESET、KEY)
目录 1. 简介 1.1 要点 1.2 buffer 介绍 2. vivado 工程 2.1 Block Design 2.2 IBUFDS 2.3 BUFGCE_DIV 2.4 Processor System Reset 2.5 key_mod 2.6 led_drv 3. 编译与调试 3.1 XDC 3.2 Debug 4. 总结 1. 简介 1.1 要点 了解 Utility Buffer v2.2 中的 Buffer…...
7--苍穹外卖-SpringBoot项目中套餐管理 详解(一)
前言 目录 新增套餐 需求分析和设计 代码开发 根据分类id查询菜品 Controller层 Service层 ServiceImpl层 Mapper层 DishMapper.xml 新增套餐 实体类 mapper层 Service层 ServiceImpl层 Mapper层 SetmealMapper.xml setmealDishMapper.xml 套餐分页查询 需求分…...
【尚硅谷】RocketMQ 消息队列学习笔记
RocketMQ 和 Kafka 消息队列概念比较? 好的!RocketMQ 和 Kafka 都是分布式消息队列系统,它们的核心概念有很多相似之处,但在具体实现和命名上有所不同。下面我通过一个表格来对比 RocketMQ 和 Kafka 中的五个概念:消息…...
C题(三)芝麻开门 --- strcmp函数应用
场景一:“芝麻开门 ”是通往C语言的大门的暗号,现在你需要说对暗号,大门才会打开。 【分解目标1】字符串的输入 char arr[20] { 0 }; //字符的集合---字符串(数组表示)//20为预定的数组的大小scanf("%s", a…...
C++函数模板、选择排序实现(从大到小)
template <class T> void mysw (T &a , T &b) {T temp b;b a;a temp; }template <class T> void muSort( T &arr ,int len) {//该实现为选择排序(高到低)for (int i 0; i < len; i) {int max i ; //首先默认本次循环首位元素为最大for (int j …...
EasyExcel使用介绍
EasyExcel使用 1、EasyExcel介绍 1.1 官网介绍 传统操作Excel大多都是利用Apach POI进行操作的,但是POI框架并不完善,使用过程非常繁琐且有较多的缺陷: 动态操作Excel非常繁琐,对于新手来说,很难在短时间内上手;读写时需要占用…...
字段临时缓存包装器
前言 在实际开发中,我们有时候存在一种需求,例如对于某个字段,我们希望在某个明确的保存节点前对字段的修改都仅作为缓存保留,最终是否应用这些修改取决于某些条件,比如玩家对游戏设置的修改可能需要玩家明确确认应用修…...
Python(三)——列表
文章目录 创建列表访问下标遍历列表元素新增元素查找元素删除元素连接列表切片操作 创建列表 创建列表主要有两种方式 [ ]表示一个空的列表 a [] print(type(a)) # <class list> print(a) # []通过list()的方式来创建一个空列表 a list() print(type(a)) # …...
MySQL--三大范式(超详解)
目录 一、前言二、三大范式2.1概念2.2第一范式(1NF)2.3第二范式(2NF)2.3第三范式(3NF) 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导,有什么不对的地方,我会及时改进…...
追梦无Bug的软件世界
追梦无Bug的软件世界:测试人员的视角与探索 我有一个梦想,今天我们共同承载着一个愿景:创造一个没有Bug的软件世界。 我梦想有一天,用户将享受到完全无Bug的软件体验,用户不再因为软件中的Bug而感到困扰和沮丧。 我梦…...
在C#中使用Redis实现高效消息队列
使用Redis实现C#中的消息队列 Redis是一种开源的内存数据结构存储系统,因其高性能和灵活性被广泛用于缓存、数据库和消息队列等场景。本文将详细介绍如何在C#中使用Redis实现一个简单的消息队列,涵盖环境准备、代码实现和使用示例。 1. 环境准备 1.1 安装Redis 首先,确保…...
微服务JMeter解析部署使用全流程
目录 1、介绍 2、下载 3、运行 4、设置简体中文版 5、开始测试 1、添加线程组 2、添加监听器 3、添加请求 先.测试userController里的查询方法 6、查看结果 1、查看结果树 2、汇总报告 3、聚合报告 7、JMeter报错 1、介绍 Apache JMeter 是 Apache 组织基于 Java…...
Python 从入门到实战32(数据库MySQL)
我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们讨论了数据库编程接口操作的相关知识。今天我们将学习…...
hrnet训练的pt模型结合目标检测进行关键点识别的更准确前向推理
本篇在将图像输入hrnet识别之前先进行目标检测来确定识别的位置,让识别更加精准。 本段代码设置了一个区域框BOX,让人走入区域内才开始检测,适用于考核等场景,也可以直接去掉BOX也是一样的效果。若画面背景中有多个行人࿰…...
Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II
Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II 1. 解题思路2. 代码实现 题目链接:3306. Count of Substrings Containing Every Vowel and K Consonants II 1. 解题思路 这一题的话思路上就是一个滑动窗口,考察没一…...
算法笔记(五)——分治
文章目录 算法笔记(五)——分治快排颜色分类排序数组数组中的第K个最大元素库存管理 III 归并排序数组交易逆序对的总数计算右侧小于当前元素的个数翻转对 算法笔记(五)——分治 分治算法字面上的解释是“分而治之”,就…...
多级侧边菜单(递归)
需要编写两个文件 aside-menu.vue 和 menu-item.vue menu-item.vue <script setup> defineOptions({name: MenuItem}) defineProps({menuList: Array}) </script><template><template v-for"menu of menuList"><!-- 如果当前有子菜单&a…...
JavaScript break与continue语句
break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。 break break语句用于跳出代码块或循环 for(i0;i<100;i){if(i5){break;}console.log(i);} continue continue语句用于应即终止本轮循环,返回循环结构的头部,开始下一轮循环。…...
算法【从递归入手一维动态规划】
动态规划:用空间代替重复计算,包含一整套原理和技巧的总和。后面会有非常多的文章介绍动态规划。 有些递归在展开计算时,总是重复调用同一个子问题的解,这种重复调用的递归变成动态规划很有收益。如果每次展开都是不同的解&#…...
Linux中的进程间通信之共享内存
共享内存 共享内存示意图 共享内存数据结构 struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kerne…...
第18周 3-过滤器
过滤器(Filter)概念总结 什么是过滤器 过滤器(Filter)是Java Web应用中用于统一拦截和处理请求的组件,类似于现实生活中的空气净化器或安检。它通过对请求进行前置处理,确保请求符合特定要求。 过滤器的…...
Linux之进程概念
作者主页: 作者主页 本篇博客专栏:Linux专栏 创作时间 :2024年9月28日 基本概念: 进程说白了其实就是一个程序的执行实例,正在执行的程序。 在内核层面来说,就是一个担当分配资源(CPU时间…...
小程序-使用npm包
目录 Vant Weapp 安装 Vant 组件库 使用 Vant 组件 定制全局主题样式 API Promise化 1. 基于回调函数的异步 API 的缺点 2. 什么是 API Promise 化 3. 实现 API Promise 化 4.调用 Promise 化之后的异步 API 小程序对 npm 的支持与限制 目前,小程序中已经…...
【springboot】整合沙箱支付
目录 1. 配置沙箱应用环境2. 配置springboot项目1. 引入依赖2. 配置文件注册下载ngrok 3. 创建支付宝支付服务类4. 支付界面模板5. 控制类实现支付6. 测试 1. 配置沙箱应用环境 使用支付宝账号登录到开放平台控制台。 使用支付宝登录后,看到以下页面,下…...
技术速递|Python in Visual Studio Code 2024年9月发布
排版:Alan Wang 我们很高兴地宣布将于 2024 年 9 月发布适用于 Visual Studio Code 的 Python 和 Jupyter 扩展! 此版本包括以下公告: Django 单元测试支持使用 Pylance 从 inlay 提示转到定义 如果您有兴趣,可以在我们的 Pyth…...
杭州今日重点新闻/重庆seo推广外包
首先说明下RUN、CMD、ENTRYPOINT 等命令都可以用来执行命令,但是各有不同的特点 RUN 在Build Image的时候执行。CMD ENTRYPOINT 在运行Image时执行。CMD 可以和ENTRYPOINT 搭配使用,也可以单个命令使用。当CMD 和ENTRYPOINT都出现在一个DockerFile中时&a…...
高端品牌护肤品有哪些/网站seo报告
导读:本报告共四个章节,分别是经济展望、人才洞察、薪酬和福利趋势、重新设计整体报酬。关注公众号:【互联互通社区】,回复【2023薪酬趋势】获取全部报告内容。以下是报告部分内容精彩推荐精彩推荐▶2020雷军小米10周年演讲PPT刘润…...
公司网站建设多少费用哪里济南兴田德润有活动吗/最新中国新闻
今天看了一下NTFS多数据流的文件记录,随手把前几天的做的NTFS常驻与非常驻的模板打开了但是模板解释出来的信息不对然后就修正了一下,这回好了。模板完善了,多数据流的文件恢复软件是搜索找不到的,因为常规软件都是查找默认的流&a…...
花生壳如何做网站/群排名优化软件
题目链接:https://vjudge.net/contest/149212#overview。 A题,水题,略过。 B题,水题,读清题意即可。 C题,数学题,如果把x表示成xnbm,则kn/m属于[1,a],m属于[1,b-1]。然后…...
专门做茶叶的网站/磁力链搜索引擎入口
我认为现代世界里最重要的不是我们所处的位置,而是我们前进的方向。 (老奥利费温德尔霍姆斯)大家好,我是今天的值班小编,业余android开发工程师,来这个平台凑个数。今天是鼠年的第四天了,不知道朋友们在家里宅的可…...
wordpress等模版比较/新区快速seo排名
目录 前言:搭建 etcd 集群 一.主机搭建 1.编辑第一台节点的etcd.conf文件 (1).删除之前的数据 (2).编辑systemd配置文件 (3).开放端口 2.克隆虚拟机 (1).克隆 &…...