c++
文章平均质量分 68
vector6_
linux c++/java
展开
-
利用destructors 避免泄漏资源
利用destructors 避免泄漏资源某些场景下,我们需要用指针来操控局部性资源,例如:class dataHeader;void process(istream& data){ while(data) { dataHeader* = readData(data); dataHeader->processHeader(); delete dataHeader; }}就如上面的代码段,在 process() 函数中,读取data 的header 并且处理消息头,原创 2022-04-30 11:01:52 · 124 阅读 · 0 评论 -
operator new & operator delete
operator new & operator deletenew operator 和 operator new对于如下代码:string *ps = new string("string construct");代码中使用的new 即为 new operator,这个操作符是由语言内建的,类似sizeof ,不能被改变意义(重载)。不能改变其行为。我们知道 new operator 主要做了两件事:分配足够的内存,用来放置某类型的对象。调用一个constructor,为刚才分配原创 2022-04-30 11:01:24 · 121 阅读 · 0 评论 -
在栈/堆上生成对象
在栈/堆上生成对象c++中,有时我们希望某种类型的对象有“自我析构”的能力,即能够"delete this",这样就要求该类型的对象被分配于堆中。另外还可能在某些场景下必须保证某一类型绝不会发生内存泄漏,即需要没有任何一个该类型的对象从堆中分配出来。在堆中生成对象我们知道非堆对象会在其定义点自动构造,并在其寿命结束时自动析构,所以要保证对象在堆中生成,只要让那些被隐式调用的构造函数和析构函数不合法就可以了。更具体来说,最直接的方法是将构造函数和析构函数都声明为private,但由于一个类可能有许多个原创 2022-04-30 10:47:36 · 131 阅读 · 0 评论 -
内存池——TCMalloc&JEMalloc
内存池——TCMalloc&JEMalloc在应用层业务代码与内核之间,一般有两层内存池:应用层内存池和C库内存池。当代码申请内存时,首先会到达应用层内存池,如果应用层内存池有足够的可用内存,就会直接返回给业务代码,否则,它会向更底层的 C 库内存池申请内存。比如,如果我们在Apache、Nginx 等服务之上做模块开发,这些服务中就有独立的内存池。C库内存池主要有Google 的 TCMalloc 和 FaceBook 的 JEMalloc,当C库内存池无法满足内存申请时,才会向操作系统申原创 2022-04-30 10:45:10 · 920 阅读 · 0 评论 -
c++ 内存管理 —— delete释放内存的时效性
c++ 内存管理 —— delete释放内存的时效性delete释放之后,内容是立即回收的吗?#include <iostream>using namespace std;int main(){int *map; int i=10; while(i--) { map=new int[20]; map[i]=i; cout << map[i]<<endl;//1 delete [] map; co原创 2021-10-08 00:16:59 · 1489 阅读 · 0 评论 -
Range-based 循环语法
c++11 Range-based 循环语法大多数语言都支持 for-each 语法遍历一个数组或集合中的元素,在 C++ 98/03 规范中,对于一个数组 int arr[10],如果我们想要遍历这个数组,只能使用递增的计数去引用数组中每个元素:int arr[10] = {0};for (int i = 0; i < 10; ++i){ std::cout << arr[i] << std::endl;}在 C++ 11 规范中有了 for-each原创 2021-10-07 22:34:41 · 306 阅读 · 0 评论 -
统一的类成员初始化语法与 stdinitializer_list
统一的初始化语法:列表初始化与 std::initializer_list类成员的列表初始化假设类 A 有一个成员变量是一个 int 数组,在 C++ 98/03 标准中,如果我们要在构造函数中对其进行初始化,我们需要这样写://C++ 98/03 类成员变量是数组时的初始化语法class A{public: A() { arr[0] = 2; arr[1] = 0; arr[2] = 1; arr[3] = 9;原创 2021-10-07 22:34:00 · 360 阅读 · 1 评论 -
static的作用
static的作用全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)。作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。局部静态变量在局部变量之前加上关键字static,局部变量就成为一个局部静态变量。内存中的位置:静态存储区。初始化:未经初始化的全局静态变量会被自动初始化原创 2021-05-16 11:11:54 · 114 阅读 · 0 评论 -
C/C++程序的编译链接过程
C/C++程序的编译链接过程C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件1.编译预处理读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理, 伪指令主要包括以下四个方面(1)宏定义指令,如#define Name TokenString,#undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的Name则不被替换。对于原创 2021-05-16 11:11:16 · 513 阅读 · 0 评论 -
shared_ptr 与 weak_ptr
shared_ptr 与 weak_ptrshared_ptr是带引用计数的智能指针,可以说大部分的情形选择用shared_ptr不会出问题。那么weak_ptr是什么,应该怎么用呢?weak_ptr被设计为与shared_ptr共同工作,可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。同样,在weak_ptr析构时也不会导致引用计数的减少,它只是一个静静地观察者。weak_ptr没有重载operat原创 2021-04-06 01:18:10 · 401 阅读 · 1 评论 -
static_assert
static_assert1.关键字介绍断⾔是编程中的⼀种常⻅⼿段,它并不是正常程序所必需的,不过对于程序的调试来说,通常断⾔能够帮助程序开发者快速定位那些违反了某些前提条件的程序错误。C++现有的断⾔机制有运⾏时、预处理时以及编译时断⾔,其中:编译时断⾔ – static_assert运行时断言 – assert预处理时断言 – #error2.语法结构static_assert(断⾔表达式,告警信息);static_assert断⾔接受两个参数:第⼀个参数是断⾔表达式,这个表原创 2020-12-11 23:08:01 · 575 阅读 · 0 评论